# Developer Guide

Welcome to your team’s developer platform

<h2 align="center">Build your integration with <mark style="color:$primary;">SiteMinder</mark></h2>

<p align="center"></p>

<p align="center">Whether you're just getting started or expanding an existing integration, this guide has everything you need — API documentation, integration requirements, and step-by-step guidance to connect your product to the world's leading hotel commerce platform.</p>

<p align="center"></p>

<p align="center"><a href="/spaces/92zPf4HGXVXOcZxi8abg/pages/UodbWYtCIlaHofdJm3wQ" class="button primary">Start Here</a> <a href="/spaces/92zPf4HGXVXOcZxi8abg/pages/G5KWUaY29iktcTyTEUxt" class="button secondary">Our APIs</a></p>

<p align="center"></p>

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4><i class="fa-arrow-progress" style="color:$primary;">:arrow-progress:</i></h4></td><td><strong>New Partner</strong></td><td>Follow a structured path to apply, build, certify, and go live with your integration.<br></td><td><a href="/spaces/92zPf4HGXVXOcZxi8abg/pages/RAgwk1sEthWhrn360fiq">/spaces/92zPf4HGXVXOcZxi8abg/pages/RAgwk1sEthWhrn360fiq</a></td></tr><tr><td><h4><i class="fa-bars-progress" style="color:$primary;">:bars-progress:</i></h4></td><td><strong>Existing Partner</strong></td><td>Extend your integration with new capabilities, additional operations, or API upgrades.</td><td><a href="/spaces/92zPf4HGXVXOcZxi8abg/pages/x6X8WsYBFSJoZjh6aULi">/spaces/92zPf4HGXVXOcZxi8abg/pages/x6X8WsYBFSJoZjh6aULi</a></td></tr></tbody></table>

***

### Not sure where to start? Ask our AI Assistant.

Tell us what you’re building or trying to troubleshoot, and get guidance on the right APIs, documentation, and next steps.

<button type="button" class="button primary" data-action="ask" data-icon="sparkles">What are you building, or what do you need help with?</button>

{% hint style="info" %}
Need to speak to someone? Check [Partner Contacts](https://www.siteminder.com/partners-contact/).
{% endhint %}


# Get Started

Choose your integration path and start building with SiteMinder APIs.

### Integration Type

Select the option that best describes your system to access the right API.

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-type="content-ref"></th><th data-type="content-ref"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4><i class="fa-bell-concierge" style="color:blue;">:bell-concierge:</i></h4></td><td><strong>PMS</strong></td><td>Manage reservations and sync availability, restrictions, and rates across booking channels.</td><td><a href="/spaces/bg0jrpuqP6OiahVmxtFa/pages/D0FWDlgVOKE9uSFHN7Zj">/spaces/bg0jrpuqP6OiahVmxtFa/pages/D0FWDlgVOKE9uSFHN7Zj</a></td><td></td><td><a href="/pages/W8VJtVgeqPXpl5BGFxGR">/pages/W8VJtVgeqPXpl5BGFxGR</a></td></tr><tr><td><h4><i class="fa-globe-pointer" style="color:blue;">:globe-pointer:</i></h4></td><td><strong>Booking Channel</strong></td><td>Access live availability, restrictions, and rates, and deliver reservations in real time.</td><td><a href="/spaces/O3pvuDdZQERG5V3OYhgL/pages/VbACGW6iRhCRbcznvo5V">/spaces/O3pvuDdZQERG5V3OYhgL/pages/VbACGW6iRhCRbcznvo5V</a></td><td><a href="/spaces/eet4EgIUAEszYKtCqnhu/pages/xDFhrc3ohSpVrjYaagUO">/spaces/eet4EgIUAEszYKtCqnhu/pages/xDFhrc3ohSpVrjYaagUO</a></td><td><a href="/pages/xB0wKQHh3y7kdkIfhZaC">/pages/xB0wKQHh3y7kdkIfhZaC</a></td></tr><tr><td><h4><i class="fa-laptop-mobile" style="color:blue;">:laptop-mobile:</i></h4></td><td><strong>Application</strong></td><td>Access reservation and property data to power your product (e.g. CRM, guest experience, upselling).</td><td><a href="/spaces/63FrotJzBqMEYrZjIkZ4/pages/jZ5A9NWygcwpq6KE7X24">/spaces/63FrotJzBqMEYrZjIkZ4/pages/jZ5A9NWygcwpq6KE7X24</a></td><td></td><td><a href="/pages/kPyBG7bcPh3hMoXacjuU">/pages/kPyBG7bcPh3hMoXacjuU</a></td></tr><tr><td><h4><i class="fa-chart-mixed" style="color:blue;">:chart-mixed:</i></h4></td><td><strong>RMS</strong></td><td>Optimise pricing and push rates and restrictions in real time, with optional access to reservation data.</td><td><a href="/spaces/bg0jrpuqP6OiahVmxtFa/pages/D0FWDlgVOKE9uSFHN7Zj">/spaces/bg0jrpuqP6OiahVmxtFa/pages/D0FWDlgVOKE9uSFHN7Zj</a></td><td><a href="/spaces/63FrotJzBqMEYrZjIkZ4/pages/jZ5A9NWygcwpq6KE7X24">/spaces/63FrotJzBqMEYrZjIkZ4/pages/jZ5A9NWygcwpq6KE7X24</a></td><td><a href="/pages/K0nxUQqXH71F1HlpvRg2">/pages/K0nxUQqXH71F1HlpvRg2</a></td></tr><tr><td><h4><i class="fa-square-h" style="color:blue;">:square-h:</i></h4></td><td><strong>Property / Hotel Group</strong></td><td>Build direct booking experiences using real-time availability, restrictions, rates, and property data.</td><td><a href="/spaces/njCTaraku33FsXMuB8N0/pages/j4NKUlFFcTFkYn68rMPF">/spaces/njCTaraku33FsXMuB8N0/pages/j4NKUlFFcTFkYn68rMPF</a></td><td></td><td><a href="/pages/uzPANxPvZYb4bvpMDxzs">/pages/uzPANxPvZYb4bvpMDxzs</a></td></tr></tbody></table>

***

### Partner Lifecycle

Follow these steps to build, certify, and grow your integration.

{% stepper %}
{% step %}

#### Become a SiteMinder Partner

Get access to test accounts, documentation, and start your integration.

→ [Apply to become a partner](https://www.siteminder.com/integrations/apply-now/).
{% endstep %}

{% step %}

#### Build

Develop your integration and test it using the SiteMinder sandbox environment.
{% endstep %}

{% step %}

#### Certify

Validate your integration by completing certification scenarios and meeting SiteMinder requirements.
{% endstep %}

{% step %}

#### Go live

Connect your first property and launch your integration to production.
{% endstep %}

{% step %}

#### Enhance

Expand your integration with additional capabilities or API features.
{% endstep %}
{% endstepper %}

→ View the full [Integration Process](/get-started/partner-lifecycle/integration-process) and [Enhance Your Integration](/get-started/partner-lifecycle/enhance-your-integration)

***

### Available APIs

Select the API that matches your system and use case. Some integrations may use more than one API depending on the functionality required.

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4><i class="fa-code-simple" style="color:blue;">:code-simple:</i></h4></td><td><strong>pmsXchange</strong></td><td>Synchronise availability, restrictions, rates, and reservations between your system and SiteMinder.</td><td><a href="/spaces/bg0jrpuqP6OiahVmxtFa/pages/D0FWDlgVOKE9uSFHN7Zj">/spaces/bg0jrpuqP6OiahVmxtFa/pages/D0FWDlgVOKE9uSFHN7Zj</a></td></tr><tr><td><h4><i class="fa-code-simple" style="color:blue;">:code-simple:</i></h4></td><td><strong>SiteConnect</strong></td><td>Receive availability, restrictions, and rates from SiteMinder and send reservations in real time.</td><td><a href="/spaces/O3pvuDdZQERG5V3OYhgL/pages/VbACGW6iRhCRbcznvo5V">/spaces/O3pvuDdZQERG5V3OYhgL/pages/VbACGW6iRhCRbcznvo5V</a></td></tr><tr><td><h4><i class="fa-code-simple" style="color:blue;">:code-simple:</i></h4></td><td><strong>Channels Plus</strong></td><td>Search properties, retrieve availability and pricing, and manage reservations via REST APIs.</td><td><a href="/spaces/eet4EgIUAEszYKtCqnhu/pages/xDFhrc3ohSpVrjYaagUO">/spaces/eet4EgIUAEszYKtCqnhu/pages/xDFhrc3ohSpVrjYaagUO</a></td></tr><tr><td><h4><i class="fa-code-simple" style="color:blue;">:code-simple:</i></h4></td><td><strong>SMX</strong></td><td>Access reservation data, availability, and pricing to power apps and revenue management tools.</td><td><a href="/spaces/63FrotJzBqMEYrZjIkZ4/pages/jZ5A9NWygcwpq6KE7X24">/spaces/63FrotJzBqMEYrZjIkZ4/pages/jZ5A9NWygcwpq6KE7X24</a></td></tr><tr><td><h4><i class="fa-code-simple" style="color:blue;">:code-simple:</i></h4></td><td><strong>Direct Booking</strong></td><td>Build direct booking experiences using real-time availability, restrictions, rates, and property data.</td><td><a href="/spaces/njCTaraku33FsXMuB8N0/pages/j4NKUlFFcTFkYn68rMPF">/spaces/njCTaraku33FsXMuB8N0/pages/j4NKUlFFcTFkYn68rMPF</a></td></tr></tbody></table>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# SiteMinder APIs

SiteMinder offers five APIs covering different integration types and use cases. Use the table below to find the right API for your system, then follow the link to its full documentation.

### Which API to use?

<table><thead><tr><th width="351.265625">If you are...</th><th width="220.708251953125">Use this API</th><th>Protocol</th></tr></thead><tbody><tr><td>Property Management System (PMS)</td><td>pmsXchange</td><td>SOAP + REST</td></tr><tr><td>Revenue Management System (RMS)</td><td>pmsXchange + SMX</td><td>SOAP + REST</td></tr><tr><td>Booking Channel - direct hotel contracts</td><td>SiteConnect</td><td>SOAP</td></tr><tr><td>Booking Channel - broad property access</td><td>Channels Plus</td><td>REST</td></tr><tr><td>Application</td><td>SMX</td><td>SOAP + REST</td></tr><tr><td>Property / Hotel Group</td><td>Direct Booking</td><td>REST</td></tr></tbody></table>

### pmsXchange

**For:** Property Management Systems (PMS) and Revenue Management Systems (RMS)

PMS partners use pmsXchange to synchronise availability, restrictions, rates, and reservations between your system and SiteMinder.&#x20;

RMS partners use pmsXchnage alongside SMX — pmsXchange handles rate and restrictions sync, while SMX provides the reservation data layer .

→ View the [pmsXchange API](/pmsxchange-api)

### SiteConnect

**For:** Booking channels, OTAs, wholesalers, and distribution partners with direct hotel contracts

Receives availability, restrictions, and rates from SiteMinder and sends reservations back in real time. SiteConnect is a two-way push API — SiteMinder pushes ARI updates to your system, and you push new, modified, and cancelled reservations back. Access is limited to properties you have a direct contract with.

→ View the [SiteConnect API](/siteconnect-api)

### Channels Plus

**For:** Booking channels and distribution partners seeking access to a broad set of SiteMinder-connected properties

Search properties, retrieve availability and pricing, and manage reservations via REST APIs. Unlike SiteConnect, Channels Plus gives you access to all SiteMinder-connected properties that have opted in — without requiring direct contracts with each property.

→ View the [Channels Plus API](/channels-plus-api)

### SMX

**For:** Applications and Revenue Management Systems (RMS)

Provides access to reservation data from SiteMinder to power your product. Common use cases include analytics tools, pricing and revenue optimisation, guest experience platforms, upselling tools, and operational management products.

RMS partners use SMX alongside pmsXchange — SMX provides the reservation data layer, while pmsXchange handles rate and restrictions sync.

→ View the [SMX API](/smx-api)

### Direct Booking

**For:** Properties and hotel groups building direct booking experiences

Build direct booking engines using real-time availability, restrictions, rates, and property data from SiteMinder. Designed for properties and hotel groups that want to power their own booking interface without relying on third-party channels. Limited to SiteMinder customers using Direct Booking.

→ View the [Direct Booking API](/direct-booking-api)

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Property Management System (PMS)

Keep your PMS and SiteMinder in sync — availability, rates, restrictions, and reservations updated in real time across all connected channels.

Your PMS sends availability, rates, and restrictions to SiteMinder, which distributes them across booking channels. Reservations created on those channels flow back to your PMS automatically.

> **API used:**&#x20;
>
> [**pmsXchange**](/pmsxchange-api) - availability, rate and restriction updates, and reservation management.

{% hint style="success" %}
**PMS integrations require a pilot property before going live.**

A single property is connected to production to validate that everything works correctly in a live environment before scaling to additional properties.
{% endhint %}

***

### What you need to build

#### Core

Core functionality is required to go live and enables the essential data exchange required to go live.

* [Rooms and Rates (SM → PMS)](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms)
* [Availability (PMS → SM)](/pmsxchange-api/reference/availability)
* [Reservations Push (SM → PMS)](/pmsxchange-api/reference/reservations/push) or [Reservations Pull (SM → PMS)](/pmsxchange-api/reference/reservations/pull)

#### Additional

Additional functionality extends your integration beyond core certification scope. These are not required to go live but are recommended to deliver a complete PMS integration.

* [Rates OBP or PDP (PMS → SM)](/pmsxchange-api/reference/rates/pms-to-sm)
* [Restrictions (PMS → SM)](/pmsxchange-api/reference/restrictions/pms-to-sm)
* [Payment Transaction Record](/pmsxchange-api/reference/payment-transaction-record)

#### **UltraSync&#x20;**<mark style="color:orange;">**Beta**</mark>

*Advanced bidirectional sync between PMS and SiteMinder.*\
\
UltraSync extends pmsXchange by enabling real-time updates in both directions. SiteMinder can push rates and restrictions to your PMS, and your PMS can upload reservations directly to SiteMinder.

{% hint style="warning" %}
**Prerequisite:** To implement UltraSync `Rates OBP or PDP (SM → PMS)` and `Restrictions (SM → PMS)`, you must first implement `Rates OBP or PDP (PMS → SM)` and `Restrictions (PMS → SM)` from the Additional functionalities tier above.
{% endhint %}

* [Rooms and Rates (PMS → SM)](/pmsxchange-api/reference/rooms-and-rates/pms-to-sm)
* [Rates OBP or PDP (SM → PMS)](/pmsxchange-api/reference/rates/sm-to-pms)
* [Restrictions (SM → PMS)](/pmsxchange-api/reference/restrictions/sm-to-pms)
* [Reservations Upload (PMS → SM)](/pmsxchange-api/reference/reservations/upload)
* [Reservations Import](/pmsxchange-api/reference/reservations/import)

→ View the full [pmsXchange API Overview](/pmsxchange-api/guides/api-overview)

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Revenue Management System (RMS)

Push optimised rates and restrictions to SiteMinder in real time, with optional access to reservation data to inform pricing decisions.

Your RMS sends rate and restriction updates to SiteMinder, which distributes them across all connected booking channels. Optionally, your RMS can also receive reservation data from SiteMinder to feed pricing models.

> **API used:**
>
> [**pmsXchange**](/pmsxchange-api) - rate and restriction updates.\
> [**SMX**](/smx-api) - reservation data access (optional).

{% hint style="success" %}
**RMS integrations require a pilot property before going live.**

A single property is connected to production to validate that everything works correctly in a live environment before scaling to additional properties.
{% endhint %}

***

### What you need to build

#### Core

Core functionality enables your RMS to update pricing data in SiteMinder.

* [Rooms and Rates (SM → PMS](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms))
* [Rates OBP or PDP (PMS → SM)](/pmsxchange-api/reference/rates/pms-to-sm)

#### Additional

Additional functionality enhances pricing strategies by incorporating more data inputs.Additional functionality enhances pricing strategies by incorporating more data inputs.

* [Restrictions (PMS → SM)](/pmsxchange-api/reference/restrictions/pms-to-sm)
* [Reservations](/smx-api/reference/reservations) (via [SMX](/smx-api))

→ View the full [pmsXchange API Overview](/pmsxchange-api/guides/api-overview)

→ View the full [SMX API Overview](/smx-api/guides/api-overview)

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Booking Channel

Access live hotel inventory and deliver reservations directly to properties through SiteMinder.

Your platform connects to SiteMinder to retrieve real-time availability, rates, and restrictions, then sends confirmed reservations back to the property.&#x20;

> **API used:**
>
> [**SiteConnect**](/siteconnect-api) - direct connectivity with contracted properties.\
> [**Channels Plus**](/channels-plus-api) - access to properties and content without needing direct contracts.

{% hint style="warning" %}
**Each integration model operates independently.**

* Data retrieved through SiteConnect must be managed and returned through SiteConnect.
* Data retrieved through Channels Plus must be managed and returned through Channels Plus
* A property may use both models, but each operates as a separate integration.
  {% endhint %}

***

### What you need to build with SiteConnect

{% hint style="success" %}
**Booking channels integrations using SiteConnect require a pilot property before going live.**

A single property is connected to production to validate that everything works correctly in a live environment before scaling to additional properties.
{% endhint %}

#### Core

Core functionality is required to go live and enables the essential data exchange required to go live.

* Rooms and Rates
* Availability
* Stop Sell
* Rates (OBP or PDP)
* Reservations

#### Additional

Additional functionality extends your integration beyond core certification scope. These are not required to go live but are recommended to deliver a complete booking channel integration.

* Other Restrictions (Min. Stay, Max. Stay, CTA and CTD)
* Modifications
* Cancellations

→ View the full [pmsXchange API Overview](/pmsxchange-api/guides/api-overview)

***

### What you need to build with Channels Plus

#### Core

Core functionality is required to go live and enables the essential data exchange required to go live.

* Get Properties and Property
* Lock, Confirm, Modify and Cancel Reservations

#### Additional

Additional functionality extends your integration beyond core certification scope.&#x20;

* Get Reservation List
* Get Reservation Details

→ View the full [Channels Plus API Overview](/channels-plus-api/guides/api-overview)

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Application

Access reservation and property data from SiteMinder to power your guest experience, marketing, or operational tools.

Your application gets data from SiteMinder — reservations, availability, and pricing — to feed tools like CRM platforms, guest messaging, upselling engines, and self check-in solutions.

> **API used:**&#x20;
>
> [**SMX**](/smx-api) - access to reservation data, availability, pricing, and property information.

***

### What you need to build

#### Core

Core functionality enables your application to receive data in SiteMinder.

* [Reservations](/smx-api/reference/reservations)

#### Additional

Additional functionality extends your integration beyond core certification scope.

* [Availability and Rates](/smx-api/reference/availability-and-rates)

{% hint style="danger" %}
Availability and Rates data is not yet available for SiteMinder Platform and Little Hotelier properties.
{% endhint %}

→ View the full [SMX API Overview](/smx-api/guides/api-overview)

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Property / Hotel Group

Build a direct booking experience for your guests using live availability, pricing, and property data from SiteMinder.

Your platform retrieves property data, room types, availability, and pricing from SiteMinder to power a direct booking flow: from search and availability display through to quote generation.

> **API used:**&#x20;
>
> [**Direct Booking**](/direct-booking-api) - property data, availability, pricing, and quote generation.

{% hint style="warning" %}
**The Direct Booking API is available to groups using Multi-Property with the SiteMinder Platform, and to individual properties on the SiteMinder Platform.**

Groups or properties on the classic version of SiteMinder Channel Manager cannot access this API.
{% endhint %}

***

### What you can access

* All properties in your group (name, location, address, currency, booking engine link)
* Room types (name, description, category, size, bathroom count)
* Room rates (name, description, cancellation policy, promo code requirements)
* Live pricing and availability by check-in/out dates, occupancy, and promo code

### What you need to build

Direct booking integrations focus on retrieving and presenting property data.

* Get Properties / Property
* Get Room Types / Room Rates
* Get Quotes

→ View the full [Direct Booking API Overview](/direct-booking-api/guides/api-overview)

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Integration Process

Your step-by-step guide to building, certifying, and going live with a new SiteMinder integration.

This guide covers the full journey from initiation to going live with a new SiteMinder integration. If you're already certified and want to add functionality, see [Enhance Your Integration](/get-started/partner-lifecycle/enhance-your-integration).

{% hint style="success" %}
**Integration timeline:** Most integrations are completed within 60 days from initiation to going live, though this can vary based on the API and integration complexity.
{% endhint %}

### Prerequisites

The integration process begins only after you've completed a partnership agreement with our Ecosystem team. Our Partner Integrations team will initiate contact once all agreements are signed and finalized.

{% hint style="warning" %}
**Not a partner yet?** If you're interested in partnering with SiteMinder and integrating your technology with our platform, you'll need to apply first. Complete our [integration application](https://www.siteminder.com/integrations/apply-now/#apply-now) form, and our Ecosystem team will review it and reach out to discuss next steps.
{% endhint %}

{% stepper %}
{% step %}

### Initiation

Our Partner Integrations team will reach out to confirm the API details and collect the technical information needed to set up your test account. While you should already be familiar with the API from your discussions with our Ecosystem team, this is where we confirm the specifics.

**Key Activities:**

* Provide your endpoint details and credentials if needed
* Confirm functionalities you'll be implementing (e.g., `PDP` or `OBP` for rate management)
* Share any additional technical requirements specific to your integration
* Provide configuration details depending on your API

**Timeline:** 1-3 days

{% hint style="success" %}
Review the **Getting Started** page of the API you want to implement to start preparing the details before the process begins. Having these details ready when your partnership agreement is signed helps us move to Phase 2 within 1-3 days.
{% endhint %}
{% endstep %}

{% step %}

### Development

Once we've set up your test account, you'll receive your credentials and full access to start development. This is your main development window where you'll build and test your integration using our test environment.

**Key Activities:**

* Build your integration against our APIs
* Test thoroughly in the test environment
* Work with our Partner Integrations team to resolve any technical questions
* Prepare documentation and test results for certification

**Timeline:** 4-6 weeks

{% hint style="success" %}
Most partners complete development and testing within 4-6 weeks of receiving test account access. The timeline may vary based on your integration scope and available resources. If you anticipate needing more time, reach out to the Partner Integrations team..
{% endhint %}
{% endstep %}

{% step %}

### Certification

You'll execute our certification test scenarios to ensure everything works as expected. This includes checking edge cases and verifying your integration meets all our standards.

**Key Activities:**

* Execute our certification test scenarios
* Document test results and evidence
* Address any issues identified during certification
* Receive formal certification approval

**Timeline:** 1 week

{% hint style="success" %}
Review the **Testing and Certification** guide of the API you're implementing to ensure you're ready for certification. Thorough preparation helps us complete this phase within 1 week. If issues are identified during testing, we'll work together to resolve them quickly.
{% endhint %}
{% endstep %}

{% step %}

### Production

You're certified! Now we'll configure your integration for production. Depending on your API, this may include a pilot where we connect one property to validate everything runs smoothly in the live environment.

**Key Activities:**

* Complete production configuration and setup
* Connect pilot property to production (required only for `SiteConnect` and `pmsXchange`)
* Monitor transactions and system behavior
* Validate operational readiness with real data

**Timeline:** 1 week (if pilot is required)

{% hint style="success" %}
If you're implementing **SiteConnect** or **pmsXchange**, having a pilot property identified and prepared before certification completes helps us move through this phase within 1 week. We'll work with you and the property to ensure a smooth transition to production.
{% endhint %}
{% endstep %}

{% step %}

### Live

Your integration is now fully operational. We'll notify our internal teams, and you can start onboarding properties according to your partnership agreement.

**Key Activities:**

* Integration marked as live in our systems
* Handoff to ongoing support teams
* Begin scaling to additional properties
* Access ongoing support resources

**Timeline:** Ongoing operations

{% hint style="success" %}
Plan your property rollout strategy and familiarize yourself with our support channels. Our teams are here to help you scale successfully and troubleshoot any issues as you grow.
{% endhint %}
{% endstep %}
{% endstepper %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Enhance Your Integration

How to add new functionality, certify additional operations, or migrate an existing SiteMinder integration.

This guide is for partners who are already certified and live on SiteMinder and want to add new functionality to their existing integration. If you're starting a new integration from scratch, see [Integration Process](/get-started/partner-lifecycle/integration-process).

{% hint style="success" %}
**Enhancement timelines** vary based on the complexity of the new functionality being added. Simple feature additions may take 2-3 weeks, while more complex enhancements requiring a pilot can take 4-6 weeks. Review the relevant documentation for the new features early to streamline the process.
{% endhint %}

{% stepper %}
{% step %}

### Request

To get started, complete the [SiteMinder Test Environment Access Form](https://docs.google.com/forms/d/e/1FAIpQLSfgubeWfac9QiGMWEQg090Yg_G3dvzleBjPbbm9N5IVTyB-_A/viewform) selecting the API you're already certified for, **New Functionality Enhancement**, and the functionalities you want to implement.

{% hint style="info" %}
As part of your enhancement, we'll review your existing integration to confirm it's compatible with the new functionality and identify any improvements that keep your connection current and reliable.
{% endhint %}
{% endstep %}

{% step %}

### Development

Once we've set up your test account, you'll receive your credentials and full access to start development. This is your main development window where you'll build and test your integration using our test environment.
{% endstep %}

{% step %}

### Certification

You'll execute our certification test scenarios to ensure everything works as expected. This includes checking edge cases and verifying your integration meets all our standards.
{% endstep %}

{% step %}

### Live

Your integration is now fully operational. We'll notify our internal teams, and you can start onboarding properties according to your partnership agreement.
{% endstep %}
{% endstepper %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# FAQ

Find answers to common questions about the SiteMinder Developer Guide, our APIs, and the integration process.

### About this guide

<details>

<summary>What is the SiteMinder Developer Guide?</summary>

The SiteMinder Developer Guide is the central resource for technology partners building integrations with SiteMinder. It covers everything you need to connect your product — API documentation, integration requirements, certification guidance, and step-by-step support for the full journey from initiation to going live.

Whether you're evaluating SiteMinder APIs for the first time or expanding an existing integration, this guide is designed to help you work as independently as possible.

</details>

<details>

<summary>What solutions and APIs are covered?</summary>

* **pmsXchange** — for Property Management Systems (PMS). Synchronises availability, restrictions, rates, and reservations between your system and SiteMinder.
* **SiteConnect** — for booking channels. Receive availability, restrictions, and rates from SiteMinder and send reservations in real time.
* **Channels Plus** — for booking channels seeking broader property access. Search properties, retrieve availability and pricing, and manage reservations via REST APIs.
* **SMX (SiteMinder Exchange)** — for applications and Revenue Management Systems (RMS). Access reservation data, availability, and pricing to power your product.
* **Direct Booking** — for multi property customers building direct booking experiences using real-time availability, restrictions, rates, and property data.

</details>

<details>

<summary>How do I use the Ask assistant on this site?</summary>

The **Ask** button available at the top of every page opens an AI assistant powered by GitBook. It uses the content of this guide — including pages you've visited, information provided by SiteMinder, and your previous messages — to answer your questions.

It's best used for navigating the guide, understanding integration requirements, and troubleshooting common issues.

Like all AI tools, it can make mistakes. If something doesn't seem right, refer to the relevant documentation page directly or contact us through [Partner Contacts](https://www.siteminder.com/partners-contact/).

</details>

<details>

<summary>How can I provide feedback on the guide content?</summary>

You can share feedback in two ways:

* On any page, use the **Was this helpful?** option on the right side of the screen. Select the emoji that best reflects your experience and, if you wish, add a comment to help us improve that specific content.
* For more detailed feedback, visit our [Feedback & Suggestions](/get-started/resources/feedback-and-suggestions) page and complete the form.

Your input helps us keep the guide accurate, relevant, and useful for all partners.

</details>

### Choosing the right API

<details>

<summary>How do I know which API is right for my integration type?</summary>

The right API depends on what type of system you're building.

If you're unsure, visit the [Partner Hub](/get-started) and select the option that best describes your system — it will guide you to the right API and integration path.

</details>

<details>

<summary>What are the main differences between SiteConnect and Channels Plus?</summary>

**SiteConnect** is a two-way PUSH API. It gives you access to rates and inventory for hotels you have a direct contract with. SiteMinder pushes availability, restrictions and rates to your system, and you push reservations back in real time.

**Channels Plus** is a PULL REST API. It gives you access to availability, rates, and content for all SiteMinder-connected properties that have opted in to Channels Plus — without requiring direct contracts with each property.

Choose SiteConnect if you have direct hotel relationships and need a two-way real-time connection. Choose Channels Plus if you want broader property access without managing individual contracts.

</details>

<details>

<summary>As a booking channel, can we integrate with both SiteConnect and Channels Plus?</summary>

SiteConnect and Channels Plus cannot be technically combined within a single integration. However, a booking channel can use both APIs for different purposes — SiteConnect for properties you have direct contracts with, and Channels Plus to access additional properties\
and content beyond those direct relationships.

Each integration is certified separately.

</details>

<details>

<summary>Can we integrate with more than one API?</summary>

Yes. Some partners integrate with more than one SiteMinder API depending on the scope of their product. For example, a RMS partner may use pmsXchange for rate sync and SMX for reservation data access.

Each API requires its own certification process. If you're considering a multi-API integration, speak with the Partner Integrations team early — they can help you plan the right sequence\
and avoid duplication of effort.

</details>

### Getting started

<details>

<summary>What do I need to do before I can start building?</summary>

Before you can access SiteMinder APIs, you need to complete a partnership agreement with our Ecosystem team. If you haven't done this yet, start by submitting an [Integration Application Form](https://www.siteminder.com/integrations/apply-now/#apply-now).

Once your agreement is signed and finalised, the Partner Integrations team will reach out to initiate the technical onboarding process.

</details>

<details>

<summary>How long does the integration process take?</summary>

Most integrations are completed within **60 days** from initiation to going live, though this varies based on the API and complexity of your integration.

The process has five stages: Initiation (1–3 days), Development (4–6 weeks), Certification (1 week), Production (1 week if a pilot is required), and Live. For a full breakdown, see the [Integration Process](/get-started/partner-lifecycle/integration-process) page.

</details>

<details>

<summary>Who do I work with during the integration?</summary>

Once your partnership agreement is in place, you'll work directly with the **Partner Integrations team** throughout the build, testing, and certification stages. They will confirm your API configuration, support you during development, and guide you through certification.

For partnership or commercial questions, the **Ecosystem team** is your point of contact. You can find the right team through [Partner Contacts](https://www.siteminder.com/partners-contact/).

</details>

### Development & testing

<details>

<summary>How do I access the test environment?</summary>

Once your partnership agreement is signed and the integration process begins, the Partner Integrations team will set up a test account for you. You'll receive credentials and full access to start development and testing against our test environment.

If you're an existing certified partner requesting access for new functionality, visit [Enhance Your Integration](/get-started/partner-lifecycle/enhance-your-integration) for more details.

</details>

<details>

<summary>Can we have permanent access to the test environment?</summary>

The test environment is designed for temporary testing purposes only. It has limited infrastructure compared to the live environment, and traffic is controlled to maintain consistency for all partners conducting tests.

Existing certified partners can request temporary access for specific testing needs via the [SiteMinder Test Environment Access Form](https://docs.google.com/forms/d/e/1FAIpQLSfgubeWfac9QiGMWEQg090Yg_G3dvzleBjPbbm9N5IVTyB-_A/viewform).&#x20;

</details>

<details>

<summary>What should I prepare before certification?</summary>

Before entering certification, you should:

* Complete all development and thorough testing in the test environment
* Review the **Testing and Certification** guide for the API you're implementing
* Prepare documentation and test results as evidence
* Address any known issues or edge cases

For SiteConnect and pmsXchange integrations, identify a pilot property before certification completes — this speeds up the Production stage significantly.

The Partner Integrations team will confirm when you're ready to proceed.

</details>

### Certification & going live

<details>

<summary>What does the certification process involve?</summary>

Certification is the stage where you execute SiteMinder's test scenarios to verify your integration meets all required standards. It includes checking edge cases, validating data flows, and documenting test results and evidence.

Once certification is approved, your integration moves to the Production stage — where it's configured for the live environment and, if required, connected to a pilot property to validate real-world behaviour.

Certification typically takes **1 week** when well-prepared.

</details>

<details>

<summary>We are already a certified SiteMinder partner and want to certify against new functionality. How do we proceed?</summary>

Complete the SiteMinder Test Environment Access Form, selecting the API you're already certified for and **New Functionality Enhancement** as the request type. Specify the functionalities you want to implement.

The Partner Integrations team will process your request and contact you with next steps. For a full breakdown of the enhancement process, see [Enhance Your Integration](/get-started/partner-lifecycle/enhance-your-integration).

</details>

<details>

<summary>How do we add new properties after going live?</summary>

Once your integration is live, onboarding new properties is managed through your normal operational process — no recertification is required for individual properties unless you're adding new API functionality.

For questions about property onboarding at scale or specific configuration requirements, contact the **Partner Integrations** team through [Partner Contacts](https://www.siteminder.com/partners-contact/).

</details>

### Support

<details>

<summary>What do I do if something isn't working in production?</summary>

Start with the **Ask** button at the top of any page — it can help you diagnose common issues quickly using the guide content.

If you need direct support, find the right team through [Partner Contacts](https://www.siteminder.com/partners-contact/).

</details>

<details>

<summary>Who do I contact for partnership or commercial questions?</summary>

Partnership and commercial questions are handled by the **Ecosystem team**. Find the right contact through [Partner Contacts](https://www.siteminder.com/partners-contact/).

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Glossary

Understand key terms and definitions used throughout the SiteMinder Developer Guide to support your API integration and testing process.

### A – E

| Availability             | The number of rooms that are open for booking on specific dates.                                    |
| ------------------------ | --------------------------------------------------------------------------------------------------- |
| Booking Channel          | A platform or service where reservations can be made (e.g., OTAs, direct websites).                 |
| Close to Arrival (CTA)   | A restriction where no check-ins are allowed on a specific day, preventing bookings for that date.  |
| Close to Departure (CTD) | A restriction where no check-outs are allowed on a specific day, preventing bookings for that date. |
| Direct Booking           | SiteMinder's booking engine.                                                                        |
| Extra Adult Rate         | The additional charge applied for each adult exceeding the included occupancy.                      |
| Extra Child Rate         | The additional charge applied for each child exceeding the included occupancy.                      |

### F – J

| Gross Amount       | The total amount, including all taxes, fees, and commissions. It represents the full cost before any deductions. |
| ------------------ | ---------------------------------------------------------------------------------------------------------------- |
| Included Occupancy | The number of guests that can stay in a room without extra charges.                                              |
| Inclusions         | Additional text information provided with the room rate.                                                         |
| Inventory          | The total number of available rooms for booking at a property.                                                   |

### K – O

| Maximum Occupancy             | The highest number of guests allowed to stay in a room.                                                                                                        |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Maximum Stay on Arrival       | The maximum number of consecutive nights allowed when a guest checks in on a specific date.                                                                    |
| Maximum Stay Through          | The maximum number of consecutive nights allowed during a stay that includes a specified date.                                                                 |
| Minimum Stay on Arrival       | The minimum number of consecutive nights required when a guest checks in on a specific date.                                                                   |
| Minimum Stay Through          | The minimum number of consecutive nights required during a stay that includes a specified date.                                                                |
| Net Amount                    | The amount excluding taxes, fees, and commissions. It is the final amount received after all deductions.                                                       |
| Occupancy Based Pricing (OBP) | A pricing model where room rates vary based on the number of guests staying.                                                                                   |
| One-way Sync                  | Data flows in a single direction from one system to another. Updates made in the source system are reflected in the destination, but not the other way around. |

### P – T

| Per Day Pricing (PDP)                | A pricing model where room rates are set for each day individually.                                                                                                                |
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Platform                             | SiteMinder's cloud-based system that connects hotels with booking channels, PMS, RMS, and apps to manage availability, restrictions, rates, and reservations in real time.         |
| Rate                                 | The cost charged for a room over a specific period.                                                                                                                                |
| Rate Plan                            | A specific pricing structure that includes rules for how room rates are applied (e.g., refundable, non-refundable).                                                                |
| Release Period                       | The minimum number of days before check-in that a booking must be made. For example, a release period of 7 days means the reservation must be made at least 7 days before arrival. |
| RequestorID                          | A unique identifier created by SiteMinder to identify the partner (e.g., PMS code, channel code).                                                                                  |
| Restrictions                         | Conditions or limitations placed on room bookings (e.g., minimum stays, stop sell).                                                                                                |
| Room Rate                            | The combination of a Room Type and a Rate Plan, creating a specific pricing structure for a stay.                                                                                  |
| Room Type                            | A category of rooms with similar characteristics (e.g., single, double, suite).                                                                                                    |
| Single Guest Discount                | A reduced rate applied to a room when only one guest occupies it.                                                                                                                  |
| Synchronisation (Sync)               | The process by which two or more systems exchange data so that they remain consistent with each other.                                                                             |
| Stop Sell                            | A restriction preventing any new bookings for a room on certain dates.                                                                                                             |
| Strong Customer Authentication (SCA) | A European regulation requiring two-factor authentication to verify a customer's identity during online payments for added security.                                               |
| Three Domain Security (3DS)          | A protocol that adds an extra layer of security to online card payments by requiring cardholder authentication.                                                                    |
| Two-way Sync                         | Data flows in both directions. Updates made in either system are exchanged so both remain aligned.                                                                                 |

### U – Z

| Update Period              | Is the maximum number of days that SiteMinder sends updates to connected booking channels. |
| -------------------------- | ------------------------------------------------------------------------------------------ |
| Virtual Credit Cards (VCC) | Temporary, one-time-use credit card details provided for secure payments.                  |

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# AI Tools

The SiteMinder Developer Guide includes built-in tools to help you work faster — whether you prefer reading docs in your browser, asking questions in plain language, or connecting your AI coding agent directly to this content.

{% hint style="success" %}
Access these tools via the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** dropdown menu in the top-right of any page.
{% endhint %}

***

### Ask questions

Use AI to quickly understand requirements, troubleshoot issues, or explore the APIs without scanning full pages.

<table><thead><tr><th width="230.06329345703125">Tool</th><th>What it does</th></tr></thead><tbody><tr><td><strong>GitBook Assistant</strong></td><td>Ask questions directly on this page and get instant answers based on the documentation.</td></tr><tr><td><strong>Open in ChatGPT</strong></td><td>Continue the conversation in ChatGPT — ideal for debugging issues, generating code, or working across multiple endpoints.</td></tr><tr><td><strong>Open in Claude</strong></td><td>Use Claude for deeper analysis, code generation, or implementation guidance.</td></tr></tbody></table>

***

### Connect to your IDE

Connect this guide as a live knowledge source to your development environment. Your AI coding assistant can then query SiteMinder documentation directly.

<table><thead><tr><th width="230.0242919921875">Tool</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Connect with MCP</strong></td><td>Allow your AI tools to query SiteMinder documentation directly from your environment.</td></tr><tr><td><strong>Connect to VSCode</strong></td><td>Use this guide with GitHub Copilot and other AI features inside VSCode.</td></tr><tr><td><strong>Connect to Claude Code</strong></td><td>Give Claude access to this guide during coding sessions.</td></tr><tr><td><strong>Connect to Codex</strong></td><td>Connect this guide to ChatGPT and Codex-based coding agents.</td></tr></tbody></table>

***

### Export and copy

Use these tools when working with AI tools or sharing content internally.

<table><thead><tr><th width="230.1978759765625">Tool</th><th>What it does</th></tr></thead><tbody><tr><td><strong>Copy page</strong></td><td>Copy this page as clean Markdown — ready to paste into AI tools as context.</td></tr><tr><td><strong>View as Markdown</strong></td><td>Open the raw Markdown version for scripting or advanced workflows.</td></tr><tr><td><strong>Export as PDF</strong></td><td>Download a formatted version for offline reference or internal sharing.</td></tr></tbody></table>

***

{% hint style="warning" %}
AI-generated responses are designed to help you move faster, but they may not always be fully accurate. Always validate your implementation against the official API documentation before going to production.
{% endhint %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Feedback & Suggestions

The SiteMinder Developer Guide is designed to make your integration experience smoother and more efficient. We’d love to hear your thoughts to help us continue improving it.

{% embed url="<https://docs.google.com/forms/d/1t_BBFT0dNbJLqW3CfcdXRSGQeu2y9wu1mF1yfft9gKY/viewform>" fullWidth="false" %}


# pmsXchange

Integrate with SiteMinder using pmsXchange — a two-way API to push availability, rates, and restrictions, and synchronise reservations in real time.

pmsXchange connects PMS, RMS, and CRS providers to the SiteMinder Platform — pushing real-time rates, availability, and restrictions, while retrieving reservations, modifications, and cancellations. Partners gain instant access to SiteMinder's network of over 47,000 properties, with secure credit card delivery and streamlined property onboarding built in.

### Key Benefits

* **Real-Time Data Exchange:** Sync availability, restrictions, and rates; receive reservations with modifications, cancellations, and payment data.
* **Widest Distribution Reach:** Distribute inventory across the largest range of booking channels through a single integration.
* **Simplified Onboarding:** Streamline property setup via Reservation Import and Room and Rate APIs.
* **Marketplace Opportunity:** Connect to SiteMinder's Hotel App Store to complement your PMS offering.

### Next Steps

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4><i class="fa-circle-bolt" style="color:blue;">:circle-bolt:</i></h4></td><td><strong>Get Started</strong></td><td></td><td><a href="/pages/FjOoYmv6gdAghMjHd36L">/pages/FjOoYmv6gdAghMjHd36L</a></td></tr><tr><td><h4><i class="fa-signs-post" style="color:blue;">:signs-post:</i></h4></td><td><strong>Integration Requirements</strong></td><td></td><td><a href="/pages/QAcsxocYxcXDPXxGFtrD">/pages/QAcsxocYxcXDPXxGFtrD</a></td></tr><tr><td><h4><i class="fa-code" style="color:blue;">:code:</i></h4></td><td><strong>API Overview</strong></td><td></td><td><a href="/pages/sPIguB2mVMgXp8s3guST">/pages/sPIguB2mVMgXp8s3guST</a></td></tr></tbody></table>


# Quick Start

Everything you need to begin building with pmsXchange API.

pmsXchange connects your Property Management System (PMS) or Revenue Management System (RMS) with SiteMinder's distribution platform. Through pmsXchange, your PMS can sync availability, restrictions, and rates, and manage reservations, modifications, and cancellations. RMS integrations support pushing rates and restrictions only.

**API Operations:**

* **Configuration**: Rooms and Rates
* **Inventory**: Availability, Restrictions, Rates (PDP or OBP)
* **Reservations**: Push, Pull, Upload, Import
* **Payments**: Payment Transaction Record

{% hint style="success" %}
Explore all operation in the [API Overview](/pmsxchange-api/guides/api-overview).
{% endhint %}

***

## Before You Begin

{% hint style="info" %}
**You don't need to wait for your test environment to start development.** You can begin building and testing immediately. See [Make Your First Call](#make-your-first-call) below or explore requests directly in the [Postman](#explore-with-postman) collection.
{% endhint %}

### Partnership Required

Access to pmsXchange requires an active partnership agreement with SiteMinder. Once\
your agreement is in place, our Partner Integrations team will reach out to initiate\
your integration.

<a href="https://www.siteminder.com/integrations/apply-now/" class="button primary">Become a SiteMinder Partner</a>

### What You'll Provide to SiteMinder

When your integration begins, we'll send you an initiation email requesting the\
following. Having these ready helps us set up your test account:

<table><thead><tr><th width="160.5185546875">Item</th><th>Details</th></tr></thead><tbody><tr><td>Reservation SOAP endpoint</td><td>Your HTTPS endpoint URL for <a href="/pages/wQxFw7bEs3TAR6prKHbx">Reservations Push (SM -> PMS)</a></td></tr><tr><td>Credentials</td><td><code>username</code> and <code>password</code> for SiteMinder to authenticate against your Reservation SOAP endpoint</td></tr><tr><td>Inventory REST endpoint</td><td>For <a href="/pages/cQbGVLFKtlfIwlSf6Dm7">Rooms and Rates (PMS -> SM)</a>, <a href="/pages/BiyZLgipH8UbYgBveY44">Restrictions (SM -> PMS)</a> and <a href="/pages/d9UKRGJNxKuLpWDBT11O">Rates (SM -> PMS)</a></td></tr><tr><td>Credentials</td><td><code>username</code> and <code>password</code> for SiteMinder to authenticate against your Inventory REST endpoint</td></tr><tr><td>Pricing Model</td><td>Whether you'll implement <a href="/pages/UYUBHAEt9gQRcrSKzOqS#per-day-pricing">Per Day Pricing (PDP)</a> or <a href="/pages/UYUBHAEt9gQRcrSKzOqS#occupancy-based-pricing-obp">Occupancy Based Pricing (OBP)</a>. </td></tr></tbody></table>

### What You'll Receive from SiteMinder

Once SiteMinder has received your details, we will provide:

<table><thead><tr><th width="188.3466796875">Item</th><th>Details</th></tr></thead><tbody><tr><td>SOAP endpoint</td><td><a href="https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D">https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}</a></td></tr><tr><td>REST endpoint</td><td><a href="https://tpi-pmsx.preprod.siteminderlabs.com/core-api/pmses/{pmsCode}/hotels/{hotelCode}/room-rates">https://tpi-pmsx.preprod.siteminderlabs.com/core-api/pmses/{pmsCode}</a></td></tr><tr><td>Credentials</td><td><code>username</code> and <code>password</code> (same both endpoints)</td></tr><tr><td>Identifiers</td><td><code>RequestorID</code> / <code>pmsCode</code></td></tr><tr><td>Hotel Code</td><td><code>HotelCode</code></td></tr><tr><td>Hotel Test Account</td><td>Platform that includes pre-configured room types and rate plans, to verify pushed inventory updates and reservation delivery status.</td></tr><tr><td>Hotel Booking Engine</td><td>Guest reservation simulator.</td></tr></tbody></table>

***

## Set Up Your Environment

### Authentication

pmsXchange uses **PMS-level authentication** — one set of credentials covers all properties. Credentials are passed via `wsse:UsernameToken` for SOAP requests and HTTP `Basic Auth` for REST.

{% code title="SOAP" overflow="wrap" expandable="true" %}

```xml
<SOAP-ENV:Header>
	<wsse:Security SOAP-ENV:mustUnderstand="1"
		xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
		<wsse:UsernameToken>
			<wsse:Username>USERNAME</wsse:Username>
			<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
		</wsse:UsernameToken>
	</wsse:Security>
</SOAP-ENV:Header>
```

{% endcode %}

{% code title="REST" overflow="wrap" expandable="true" %}

```bash
--header 'Authorization: Basic username:password'
```

{% endcode %}

#### PMS-level vs. Hotel-level authentication

<table><thead><tr><th width="250.11981201171875">Model</th><th width="243.3238525390625">Credentials</th><th align="center">SOAP/XML</th><th align="center">REST/JSON</th></tr></thead><tbody><tr><td>PMS-level (recommended)</td><td>One set for all properties</td><td align="center">✅</td><td align="center">✅</td></tr><tr><td>Hotel-level (legacy)</td><td>Per-property credentials</td><td align="center">✅</td><td align="center">❌</td></tr></tbody></table>

{% hint style="warning" %}
**Hotel-level authentication** is maintained for backward compatibility only. New integrations should use PMS-level to ensure access to all current and future functionality.
{% endhint %}

### API Specification Files

#### SOAP (WSDL)

* **Standard**: [https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}/pmsxchange.wsdl](https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D/pmsxchange.wsdl)
* **Inlined (recommended for .NET)**: `h`[https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}/pmsxchange\_flat.wsdl](https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D/pmsxchange_flat.wsdl)
* **Payment Transaction Record — Standard**: [https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}/pmsxchange\_pms\_payments.wsdl](https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D/pmsxchange_pms_payments.wsdl)
* **Payment Transaction Record — Inlined (recommended for .NET)**: [https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}/pmsxchange\_pms\_payments\_flat.wsdl](https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D/pmsxchange_pms_payments_flat.wsdl)

{% hint style="warning" %}
Use the inlined WSDL for .NET clients — the standard version may cause issues with `wsdl.exe` or `svcutil.exe` due to OTA specifications.
{% endhint %}

#### REST (OpenAPI)

* **pmsx-core-api** — [download YAML](https://openapi.gitbook.com/o/qrJuVY5UOf3h7cLyla8z/spec/pmsx-core-api.yaml)
* **pmsxultrasync** — [download YAML](https://openapi.gitbook.com/o/qrJuVY5UOf3h7cLyla8z/spec/pmsxultrasync.yaml)

***

## Make Your First Call

The first call every pmsXchange integration must implement is [Rooms and Rates (SM -> PMS)](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms) — your system retrieves the room type and rate plan mapping configured in SiteMinder for a given property. This mapping is the foundation for all subsequent inventory and reservation operations.

{% stepper %}
{% step %}

### Authenticate

Pass your `username` and `password` on every REST request.

{% code overflow="wrap" expandable="true" %}

```bash
Header: 'Authorization: Basic username:password'
```

{% endcode %}

{% hint style="success" %}
Use SiteMinder's shared test credentials to make this call:

* **PMS code**: `PMSXTEST`
* **Hotel codes**: `PMSXTEST1`, `PMSXTEST2`, `PMSXTEST3`
* **Credentials** are pre-filled in the [Postman collection](#explore-with-postman) below.
  {% endhint %}
  {% endstep %}

{% step %}

### Make the call

Retrieve the room type and rate plan mappings for a test property:

{% code overflow="wrap" expandable="true" %}

```bash
curl -L \
  --url 'https://tpi-pmsx.preprod.siteminderlabs.com/core-api/pmses/{pmsCode}/hotels/{hotelCode}/room-rates' \
  --header 'Authorization: Basic username:password' \
  --header 'X-SM-TRACE-TOKEN: text' \
  --header 'Accept: */*'
```

{% endcode %}
{% endstep %}

{% step %}

### Handle the response

A successful response returns an array of room type and rate plan combinations configured for the property:

{% code overflow="wrap" expandable="true" %}

```json
[
  {
    "ratePlanName": "Non-Refundable",
    "ratePlanCode": "NonRef1",
    "roomTypeName": "Dormitory Room",
    "roomTypeCode": "DORM",
    "includedAdultOccupancy": 2
  },
  {
    "ratePlanName": "Best Available Rate",
    "ratePlanCode": "BAR",
    "roomTypeName": "Family Room",
    "roomTypeCode": "FAM",
    "includedAdultOccupancy": 2
  },
  {
    "ratePlanName": "Non-Refundable",
    "ratePlanCode": "NonRef1",
    "roomTypeName": "Family Room",
    "roomTypeCode": "FAM",
    "includedAdultOccupancy": 2
  },
  {
    "ratePlanName": "Best Available Rate",
    "ratePlanCode": "BAR1",
    "roomTypeName": "Dormitory Room",
    "roomTypeCode": "DORM",
    "includedAdultOccupancy": 2
  }
```

{% endcode %}
{% endstep %}

{% step %}

### Handle errors

If your `username` or `password` is incorrect:

{% code overflow="wrap" expandable="true" %}

```json
{
    "errors": [
        {
            "message": "Unauthorized access",
            "code": "UnauthorizedError",
            "meta": {
                "message": "Authentication failed - received request with invalid Username/Password",
                "code": "UnauthorizedError"
            }
        }
    ]
}


```

{% endcode %}

{% hint style="danger" %}
**401** - Check your username and password are correct and passed via Basic Auth.
{% endhint %}

If your `HotelCode` is incorrect:&#x20;

{% code overflow="wrap" expandable="true" %}

```json
{
    "errors": [
        {
            "message": "Not Found",
            "code": "NotFoundError"
        }
    ]
}
```

{% endcode %}

{% hint style="danger" %}
**404 Not Found** - Check your PMS code and hotel code are correct.
{% endhint %}
{% endstep %}
{% endstepper %}

{% hint style="success" %}
**You're ready for the next step.** Once you can handle the scenarios above, reply to your initiation email with your endpoint URLs, credentials, and pricing model. We'll get your dedicated test account set up for you shortly.
{% endhint %}

***

## Explore with Postman

SiteMinder's pmsXchange Postman workspace contains collections and environments to help you build, test, and validate your integration for certification. Fork the collections and environments to your own Postman account to get started.

→ [pmsXchange Postman Workspace](https://www.postman.com/siteminder-apis/pmsxchange/overview)

### Shared Test Credentials

The **pmsXchange - Rooms and Rates TEST** environment is pre-filled with shared test credentials (`PMSXTEST` / `PMSXTEST1–3`). You can use these immediately — no dedicated test account required — to test:

* Rooms and Rates mapping retrieval
* Pushing availability, restrictions, and rates
* Pulling reservations (no reservations will be returned on shared test accounts)

Update the environment variables with your credentials once your test environment is set up.

{% hint style="info" %}
For full certification scenario coverage, see [Testing and Certification](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/testing-and-certification).
{% endhint %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Integration Requirements

Technical standards, security protocols, and compliance requirements that apply across all pmsXchange API operations.

This page defines the technical standards, security protocols, and operational requirements that apply across all pmsXchange API operations. These requirements ensure reliable, secure, and efficient connectivity between your system and the SiteMinder platform.

## Compliance Policy

All integration partners must adhere to these requirements. Due to the growing number of partner integrations, SiteMinder can no longer accommodate exceptions.

**Non-Compliance Timeline**:

* Partners have **90 days** to remediate non-compliance issues after notification.
* Failure to comply may result in interface deactivation.
* **Critical issues** affecting production stability may result in **immediate temporary suspension**.

***

## Technical Foundation

**Open Travel Alliance (OTA) Specifications**

The pmsXchange API is built on Open Travel Alliance (OTA) version 2003/05 specifications. Integration developers should be familiar with these standards, available at [http://www.opentravel.org](http://www.opentravel.org/). While this documentation is comprehensive, the OTA specifications provide additional context for complex scenarios and edge cases.

#### **SOAP Protocol Requirements**

pmsXchange **exclusively** supports **SOAP 1.1**.

**Message Structure Standards**:

* All messages follow SOAP envelope structure
* OTA message must be within `<SOAP-ENV:Body>`
* Requests include SOAP Security Header (see [Security](#security))
* Responses use empty SOAP Header: `<SOAP-ENV:Header/>`
* Content-Type: `text/xml; charset=utf-8` (no other Content-Types accepted)
* Character Encoding: UTF-8 exclusively

{% hint style="danger" %}
SOAP 1.2, or other protocols are **not supported** for XML/SOAP messages. Systems using alternative protocols must be modified to use SOAP 1.1.
{% endhint %}

#### **REST Endpoints**

pmsXchange includes REST endpoints for specific operations:

* [Rooms and Rates (SM -> PMS)](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms)
* [Rooms and Rates (PMS -> SM)](/pmsxchange-api/reference/rooms-and-rates/pms-to-sm)
* [Restrictions (SM -> PMS)](/pmsxchange-api/reference/restrictions/sm-to-pms)
* [Rates (SM -> PMS)](/pmsxchange-api/reference/rates/sm-to-pms)
* [Reservation Import](/pmsxchange-api/reference/reservations/import)

REST endpoints use standard JSON over HTTPS with Basic Authentication.

***

## Security

### Transport Layer Security

**Minimum Standard**: TLS 1.2 or higher

**Requirements**:

* All communication **must** use HTTPS over port 443
* HTTP (non-secure) connections are **prohibited**
* Production endpoints must use valid SSL certificates
* Self-signed certificates are **not supported**

### Authentication

**Method**: WS-Security (WSSE) UsernameToken (username and password) for SOAP messages and Basic Authentication for REST endpoints.

All SOAP requests include a Security Header with credentials transmitted as plain text within the HTTPS encrypted channel. REST endpoints use HTTP Basic Authentication.

**Authentication Scope**:

* One set of credentials covers all properties in your integration (PMS-level)
* Same credentials used for all API operations
* SiteMinder validates credentials on every request
* Invalid credentials return SOAP fault with error code

{% hint style="success" %}
**Security Header Format**: See individual API operation pages for complete examples.
{% endhint %}

### Authentication Models

{% hint style="warning" %}
**New integrations must use PMS-level authentication.** Hotel-level is maintained for backward compatibility only and does not support REST endpoints.
{% endhint %}

| Model                       | Credentials                | SOAP/XML | REST/JSON |
| --------------------------- | -------------------------- | -------- | --------- |
| **PMS-Level** (Recommended) | One set for all properties | ✅        | ✅         |
| **Hotel-Level** (Legacy)    | Per-property credentials   | ✅        | ❌         |

### Strong Password Policy

**Minimum Requirements**:

* At least **12 characters** long
* Mix of uppercase and lowercase letters
* At least one number
* At least one special character (e.g., `!` `@` `#` `?` `]`)

**Example Strong Password**: `MyP@ssw0rd2024!Secure`

{% hint style="warning" %}
**Restricted Characters**: Do **NOT** use the characters `<` `>` `&` `"` `'` in usernames or passwords as they cause XML parsing issues.
{% endhint %}

### IP Whitelisting (Optional)

Partners may whitelist our IPs for additional security.

**Pre-Production IPs**:

* `52.13.134.140`
* `34.213.128.113`
* `35.164.250.223`

**Production IPs**: Provided by Partner Integrations team during go-live.

{% hint style="success" %}
All SiteMinder requests originate from **port 443** (HTTPS).
{% endhint %}

***

## Message Standards

### EchoToken (Request Identifier)

**Purpose**: Unique identifier for request/response correlation and troubleshooting.

**Requirements**:

* **Must be unique** for every request
* Both request and response include the **same** EchoToken
* Used for log searching and debugging across environments
* **Format**: UUID with `8-4-4-4-12` pattern

**Example**: `ed8835ff-6198-4f38-b589-3058397f677c`

{% hint style="warning" %}
**Critical for Support**: Highly unique EchoTokens enable efficient troubleshooting. Sequential numbers or timestamp-only values slow issue resolution significantly.
{% endhint %}

### TimeStamp Format

**Standard**: ISO 8601 Date and Time format

**Accepted Formats**:

**UTC Time** (recommended):

```
2024-11-19T13:15:30Z
```

**Local Time with Offset**:

```
2024-11-19T08:15:30-05:00
```

{% hint style="success" %}
**Best Practice**: Use UTC timestamps (with `Z` suffix) to eliminate timezone confusion and simplify troubleshooting.
{% endhint %}

### XML Formatting Requirements

**Production Requirement**: Minified XML (single line, no whitespace)

All SOAP XML messages sent to SiteMinder **must be minified**, removing line breaks, newlines, and unnecessary whitespace. Single-line XML enables support teams to efficiently extract complete messages from logs using text searches.

**Correct Format**:

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"><wsse:UsernameToken><wsse:Username>USERNAME</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body><OTA_HotelAvailNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41Z" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c"><POS><Source><RequestorID Type="22" ID="PMSCODE"/></Source></POS><AvailStatusMessages HotelCode="HOTELCODE"><AvailStatusMessage BookingLimit="10"><StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP"/></AvailStatusMessage></AvailStatusMessages></OTA_HotelAvailNotifRQ></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

**Incorrect Format**:

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelAvailNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

### API Version and Namespace

**API Version**: `1.0`

All OTA messages must include `Version="1.0"` attribute in the root element.

**XML Namespace**: `http://www.opentravel.org/OTA/2003/05`

All OTA messages must declare this namespace using the `xmlns` attribute in the root element.

***

## Configuration

### Endpoint Requirements

**SiteMinder Endpoints** (SiteMinder Provides):

**Test Environment**:

* **SOAP**: `https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}`
* **REST**: `https://pmsx-core-api.dev.siteminderlabs.com/pmses/{pmsCode}`

**Production Environment**: Provided during go-live by Partner Integrations team

**Your Endpoint Requirements** (Partner Provides):&#x20;

* **SOAP**: [Reservations Push (SM → PMS)](https://developer.siteminder.com/pmsxchange-api/reference/reservations/push)
* **REST**: [Rooms and Rates (PMS → SM)](https://developer.siteminder.com/pmsxchange-api/reference/rooms-and-rates/pms-to-sm), [Rates OBP or PDP (SM → PMS)](https://developer.siteminder.com/pmsxchange-api/reference/rates/sm-to-pms), [Restrictions (SM → PMS)](https://developer.siteminder.com/pmsxchange-api/reference/restrictions/sm-to-pms)

**Mandatory Requirements**:

* Must use **registered domain name** (direct IP addresses not supported)
* Must be accessible via HTTPS on port 443
* Must accept SOAP 1.1 messages with proper Content-Type
* Must process `OTA_HotelResNotifRQ` messages

{% hint style="info" %}
**Delivery Method Configuration**: Reservation delivery (PUSH or PULL) is configured at PMS level and applies to all properties. You cannot mix delivery methods across properties.
{% endhint %}

### Property Identification (HotelCode)

**Definition**: Unique identifier assigned by SiteMinder for each property.

**Requirements**:

* Must be **unique per property**
* Used consistently across all API operations
* Cannot be changed without re-mapping (causes service disruption)

**Format**: Alphanumeric string

**Examples**: `PROP12345`, `HOTEL001`, `ABC`

{% hint style="warning" %}
**Important**: HotelCode is assigned by SiteMinder during property configuration. Your PMS must store and use these codes for all API interactions.
{% endhint %}

### RequestorID / PMS Code

**Definition**: Unique identifier for your PMS integration.

**Usage**:

* **SOAP Messages**: `<RequestorID Type="22" ID="PMSCODE"/>`
* **REST Endpoints**: Part of URL path `/pmses/{pmsCode}/`
* **WSDL URLs**: Part of path `/webservices/{RequestorID}/`

**Requirements**:

* Must match across all message types
* Case-sensitive
* Provided by SiteMinder during setup

***

## Performance and Reliability

### Response Time Requirements

**Target Performance** (per request):

* **Ideal**: Sub-1-second response
* **Acceptable**: 1-2 seconds average
* **Timeout**: 60-120 seconds (failsafe, **not a target**)

{% hint style="danger" %}
**Critical**: The 60-120 second timeout is a failsafe mechanism, not a performance goal. Responses consistently approaching this timeout indicate performance issues requiring immediate attention.
{% endhint %}

**Response Behaviour**:

* Respond with `<Success/>` or `<Errors>` immediately
* Acknowledge receipt promptly
* Process asynchronously if downstream operations take time
* Do not delay HTTP response while performing internal processing

### Message Size Limits

**Maximum Size**: 2MB (uncompressed)

**Requirements**:

* Messages exceeding 2MB will be rejected with SOAP fault
* Break large updates into multiple messages
* Use message bundling effectively (see [Best Practices](#best-practices))

**Error Response for Oversized Messages**:

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Server</faultcode>
            <faultstring xml:lang="en">Unable to process message. Payload too large</faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

### Error Handling

**Mandatory Capabilities**:

Your application **must** implement:

**1. Robust Error Detection**

* Validate all requests against OTA schema
* Detect authentication failures immediately
* Identify malformed XML and missing required fields
* Return proper SOAP faults with appropriate error codes

**2. Queuing Mechanism**

* Queue failed updates for retry
* Persist queue across application restarts
* Prevent duplicate processing
* Monitor queue depth and age

**3. Retry Strategy**

* Implement exponential backoff for transient errors
* Distinguish permanent vs. temporary failures
* Define maximum retry attempts
* Establish escalation path for persistent failures

**Recommended Retry Pattern**:

```
Attempt 1: Immediate (0 seconds)
Attempt 2: 5 seconds
Attempt 3: 15 seconds
Attempt 4: 30 seconds
Attempt 5: 60 seconds
After 5 attempts: Alert + manual intervention
```

**Detailed Guidance**: See [Error Handling](/pmsxchange-api/guides/error-handling) for complete specifications and error code reference.

***

## Best Practices

### Real-Time Updates

**Timing Requirements**:

* Send updates to SiteMinder within **2 minutes** of changes in PMS
* Ensures accurate, timely synchronization across distribution channels
* Prevents booking conflicts and inventory mismatches

**Implementation**:

* Monitor PMS data changes in real-time
* Trigger immediate update when changes occur
* Do not batch updates on fixed schedules unless changes are frequent

### Response Handling

**Wait for Responses**:

* Wait for SiteMinder response before sending next request for same property
* Set timeout between 60-120 seconds
* Prevents request queuing and duplicate processing

**Process Responses**:

* Validate `<Success/>` or `<Errors>` element
* Log all responses with EchoToken for troubleshooting
* Retry on transient failures, alert on permanent failures

### Delta Updates

**Definition**: Send **only** the data that has changed since the last update.

{% hint style="warning" %}
**Critical**: Delta updates are **strictly enforced** in production. Non-delta updates and frequent full flushes within 24-hour periods are **prohibited** as they significantly impact platform performance.
{% endhint %}

#### **Delta Update Rules**:

**DO Send**:

* Only changed availability values for specific room types and dates
* Only changed restriction values for specific room/rate combinations and dates
* Only changed rate values for specific room/rate combinations and dates

**DO NOT Send**:

* Unchanged data for any dates
* Restrictions when only availability changed
* Full date ranges when only specific dates changed
* Multiple messages for the same room/rate/date that could be bundled

**Example - Availability Change**:

For example, if a user updates the availability of a room to **4** for stay-date **2025-11-08**, please send only the availability change. Do not include restriction or rate data, and exclude any unchanged dates or room rates. While the `OTA_HotelAvailNotifRQ` message allows both availability and restrictions, updates should focus solely on the required changes.

{% tabs %}
{% tab title="Expected (Delta)" %}

```xml
<OTA_HotelAvailNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
    <POS>
        <Source>
            <RequestorID Type="22" ID="PMSCODE"/>
        </Source>
    </POS>
    <AvailStatusMessages HotelCode="HOTEL">
        <AvailStatusMessage BookingLimit="4">
            <StatusApplicationControl Start="2025-11-08" End="2025-11-08" InvTypeCode="SUP"/>
        </AvailStatusMessage>
    </AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endtab %}

{% tab title="Not Expected (Full Flush)" %}

```xml
<OTA_HotelAvailNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
    <POS>
        <Source>
            <RequestorID Type="22" ID="PMSCODE"/>
        </Source>
    </POS>
    <AvailStatusMessages HotelCode="HOTEL">
        <!-- Includes availability change -->
        <AvailStatusMessage BookingLimit="4">
            <StatusApplicationControl Start="2025-11-08" End="2025-11-08" InvTypeCode="SUP"/>
        </AvailStatusMessage>
        <!-- Incorrectly includes unchanged restrictions -->
        <AvailStatusMessage>
            <StatusApplicationControl Start="2025-11-08" End="2025-11-08" InvTypeCode="SUP" RatePlanCode="GLD"/>
            <LengthsOfStay>
                <LengthOfStay MinMaxMessageType="SetMinLOS" Time="2"/>
                <LengthOfStay MinMaxMessageType="SetMaxLOS" Time="5"/>
            </LengthsOfStay>
            <RestrictionStatus Status="Close"/>
        </AvailStatusMessage>
        <!-- More unchanged data omitted for brevity -->
    </AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endtab %}
{% endtabs %}

### Message Bundling

**Definition**: Combine updates for consecutive dates with the same values into a single date range.

#### **Bundling Best Practices**:

* Include only one room code (availability) or room/rate combination (restrictions/rates) per request
* Bundle all changed dates for that room or room/rate combination
* Use Start/End attributes for consecutive dates with same values
* Use day-of-week flags for pattern-based updates
* Avoid sending multiple small requests for individual dates

{% hint style="warning" %}
**Important**: Date ranges within a single message must not overlap for the same room (availability) or room/rate combination (restrictions/rates).
{% endhint %}

#### **Bundling Strategies**:

{% tabs %}
{% tab title="Consecutive Date Bundling" %}

```xml
<!-- Bundle consecutive dates with same rate -->
<RateAmountMessage>
    <StatusApplicationControl InvTypeCode="DBL" RatePlanCode="BAR"/>
    <Rates>
        <Rate Start="2025-07-01" End="2025-07-14">
            <BaseByGuestAmts>
                <BaseByGuestAmt AmountAfterTax="120.00"/>
            </BaseByGuestAmts>
        </Rate>
    </Rates>
</RateAmountMessage>
```

{% endtab %}

{% tab title="Day-of-Week Bundling" %}

```xml
<!-- Bundle using day-of-week flags within date range -->
<RateAmountMessage>
    <StatusApplicationControl InvTypeCode="DBL" RatePlanCode="BAR"/>
    <Rates>
        <!-- Weekend rate -->
        <Rate CurrencyCode="USD" Start="2025-07-01" End="2025-07-14" 
              Mon="0" Tue="0" Weds="0" Thur="0" Fri="1" Sat="1" Sun="0">
            <BaseByGuestAmts>
                <BaseByGuestAmt AmountBeforeTax="150.00"/>
            </BaseByGuestAmts>
        </Rate>
        <!-- Weekday rate -->
        <Rate CurrencyCode="USD" Start="2025-07-01" End="2025-07-14" 
              Mon="1" Tue="1" Weds="1" Thur="1" Fri="0" Sat="0" Sun="1">
            <BaseByGuestAmts>
                <BaseByGuestAmt AmountBeforeTax="130.00"/>
            </BaseByGuestAmts>
        </Rate>
    </Rates>
</RateAmountMessage>
```

{% endtab %}

{% tab title="Multiple Date Range Bundling" %}

```xml
<!-- Bundle multiple date ranges for same room/rate -->
<RateAmountMessages HotelCode="HOTEL">
    <RateAmountMessage>
        <StatusApplicationControl InvTypeCode="DBL" RatePlanCode="BAR"/>
        <Rates>
            <Rate CurrencyCode="USD" Start="2025-07-01" End="2025-07-14">
                <BaseByGuestAmts>
                    <BaseByGuestAmt AmountBeforeTax="150.00"/>
                </BaseByGuestAmts>
            </Rate>
        </Rates>
    </RateAmountMessage>
    <RateAmountMessage>
        <StatusApplicationControl InvTypeCode="DBL" RatePlanCode="BAR"/>
        <Rates>
            <Rate CurrencyCode="USD" Start="2025-07-15" End="2025-07-31">
                <BaseByGuestAmts>
                    <BaseByGuestAmt AmountBeforeTax="170.00"/>
                </BaseByGuestAmts>
            </Rate>
        </Rates>
    </RateAmountMessage>
</RateAmountMessages>
```

{% endtab %}
{% endtabs %}

### Full Flushes (Restricted Usage)

**Definition**: Sending complete data set for a room or room/rate combination, regardless of whether data changed.

**Permitted Usage**:

* Initial property setup/synchronization only
* System recovery after confirmed data mismatch (with SiteMinder approval)
* Migration to new PMS version (one-time)

**Prohibited Usage**:

* Regular operational updates
* Multiple full flushes within 24-hour periods
* As substitute for proper delta update implementation

{% hint style="warning" %}
**Enforcement**: Frequent full flushes significantly impact SiteMinder production environment and are strictly prohibited. Violations may result in immediate interface suspension.
{% endhint %}

### **Full Flush Best Practices** (when permitted):

* Bundle as many dates as possible per request
* Send all dates with same values in single date range
* Follow the 2MB message size limit
* Optimize bundling to minimize number of messages

***

## Pre-Production Checklist

Before requesting production access, verify all requirements are met:

### Security & Configuration

* [ ] All endpoints use HTTPS with valid certificates (not self-signed)
* [ ] Authentication credentials meet strong password policy (12+ characters)
* [ ] PMS-level authentication configured (not hotel-level)
* [ ] TLS 1.2 or higher enabled
* [ ] RequestorID/PMS Code correctly configured

### Message Standards

* [ ] EchoTokens are highly unique (UUID/GUID format)
* [ ] XML output is minified (single line, no whitespace)
* [ ] TimeStamps use ISO 8601 format (UTC recommended)
* [ ] Content-Type is `text/xml; charset=utf-8`
* [ ] API Version set to `1.0` in all SOAP messages
* [ ] XML Namespace correctly declared

### Performance & Reliability

* [ ] Response times meet targets (<2 seconds typical)
* [ ] Error handling with queue and retry implemented
* [ ] Message size validation implemented (2MB limit)
* [ ] Real-time update implementation (within 2 minutes)
* [ ] Queuing mechanism for failed messages

### Functional Requirements

* [ ] Delta update logic implemented and tested
* [ ] Message bundling implemented for consecutive dates
* [ ] Full flush restricted to initial setup only
* [ ] All mandatory test scenarios passed (see [Testing and Certification](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/testing-and-certification))
* [ ] Postman collections executed successfully
* [ ] Operation-specific requirements met (see [API Reference](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference))

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Testing and Certification

Test your pmsXchange integration and confirm readiness before going live with SiteMinder.

Use this guide to verify that all required integration capabilities are working correctly. Work through the scenarios independently, and when you're confident in your results, notify the Partner Integrations team. We'll review your readiness, prepare your account, and confirm when you can proceed to certification.

## Instructions

This guide provides a series of scenarios to test all required integration capabilities for this API. Some capabilities may be optional — if a scenario does not apply to your integration, skip it and proceed to the next one. Work through each scenario using the resources provided in the Initial Setup section, and use the results to verify your integration is working correctly before requesting certification.

Once all scenarios pass, notify the Partner Integrations team. We will review your results, and if everything looks good, confirm when you can proceed to the formal certification process.

## Initial Setup

Before working through the test scenarios, make sure the following are in place:

1. **Postman collection** — Download and import the [pmsXchange Postman](https://www.postman.com/siteminder-apis/pmsxchange/overview) collection.
2. **Test platform access** — You will need access to our test platform, configured and mapped to your PMS.
3. **Endpoints** — Ensure your endpoint is active and ready to receive requests.

{% hint style="info" %}
SiteMinder will provide credentials for our test endpoints. You will use your own credentials for your endpoint. **Make sure to replace all variables in the Postman collection before running the scenarios.**
{% endhint %}

For testing and certification purposes, we have created two basic room types and two basic rate plans that are already mapped to your PMS system. Please create the same room and rate combinations in your system to begin testing and proceed with the self-certification process.

<figure><img src="/files/AJLqsLZ3CbLHg2Q3K0Vr" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Please do not modify the mapping codes for these room rates, as they will be used for reservation certification scenarios. You may create additional room types and rate plans with your own mapping codes as needed.
{% endhint %}

## Test Scenarios

### 1. Retrieve Rooms and Rates (SM → PMS)

A PMS system sends a request to retrieve the list of configured mapping codes for room types and rate plans from the SiteMinder Platform using the [Rooms and Rates (SM -> PMS)](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/rooms-and-rates). These returned codes are then stored and used for mapping within the PMS.

{% hint style="info" %}
**Note:** You should have already built and tested this API using the generic test account provided in your welcome pack. In this step, you will call the Rooms and Rates endpoint against your own SiteMinder test platform configuration and validate both the response and the mappings.
{% endhint %}

* Use the **PMS code** and test **hotel code** configured for your integration on the SiteMinder test Platform.
* Call the Rooms and Rates endpoint for your test hotel.
* Replace:
  * {pmsCode} with your PMS code.
  * {hotelCode} with the SiteMinder test hotel code
* Validate the response
* Map codes in your PMS

<figure><img src="/files/BfvACWvnbR0POwwS3mNW" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
To successfully complete this scenario, your PMS must have retrieved all room rates mapping codes configured and mapped on SiteMinder Platform.
{% endhint %}

### 2. Small Flush Update

From the PMS, send a small full flush of all mapped room types' availability and restrictions & rates. You can do a flush of 30, 60 or 90 days.

This test ensures your PMS is bundling dates and optimising messages according to our Message Structure requirements: [Availability](/pmsxchange-api/reference/availability), [Restrictions (PMS -> SM)](/pmsxchange-api/reference/restrictions/pms-to-sm) and [Rates (PMS -> SM)](/pmsxchange-api/reference/rates/pms-to-sm).

* Check that you received a <mark style="color:green;">**Success**</mark> response from SiteMinder
* Check SiteMinder Platform -> Distribution -> Inventory Grid if the updates have been applied.

{% tabs %}
{% tab title="SiteMinder Platform Inventory" %}

<figure><img src="/files/v2lnNyy3X9teHNCg7chi" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="SiteMinder Platform Restrctions" %}

<figure><img src="/files/2r9L0XzEIP8twE7lOD2z" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

### 3. Targeted Data Update (Delta)

This scenario tests updates where only specific data points, like a single rate change or availability adjustment made in the PMS, are sent for a short period, verifying the PMS ability to push delta data updates efficiently and accurately.

To complete this scenario, first select any future month within the next year. Then, for each specified day in the table (e.g., Day 1, Day 2, Day 5), apply the changes using the corresponding dates within that chosen month. For example, if you select March, use March 1 for Day 1, March 2 for Day 2, and March 5 for Day 5.

### - Availability

Set availability for the following room type and date.

| Room Type | Date            | Availability |
| --------- | --------------- | ------------ |
| Room A    | Day 1           | 6            |
| Room B    | Day 5 to Day 10 | 10           |

### - Restrictions

Set restrictions for the following room rates and dates.

| Room Type | Rate Plan | Date            | Restriction       |
| --------- | --------- | --------------- | ----------------- |
| Room A    | Rate 2    | Day 3 to Day 7  | Enable Stop Sell  |
| Room A    | Rate 2    | Day 5           | Disable Stop Sell |
| Room A    | Rate 2    | Day 4           | Enable CTA        |
| Room A    | Rate 2    | Day 7           | Enable CTD        |
| Room A    | Rate 2    | Day 1 to Day 28 | Min. Stay to 2    |
| Room A    | Rate 2    | Day 1 to Day 28 | Max. Stay to 7    |

### - Rates

Set rates for the following room rates and dates.

#### PDP

| Room Type | Rate Plan | Date             | Value |
| --------- | --------- | ---------------- | ----- |
| Room A    | Rate 2    | Day 15 to Day 17 | 200   |
| Room A    | Rate 2    | Day 18           | 300   |
| Room A    | Rate 2    | Day 20 to Day 21 | 350   |

#### OBP

| Room Type | Rate Plan | Date            | Value |
| --------- | --------- | --------------- | ----- |
| Room A    | Guest 1   | Day 1 to Day 15 | 150   |
|           | Guest 2   |                 | 200   |
|           | Guest 3   |                 | 250   |
|           | Guest 4   |                 | 300   |
|           | Guest 5   |                 | 350   |

***

### 4. Reservations

You have two options to create test reservations, modifications, and cancellations to validate the **Reservations** API flow:

* **Direct Booking Engine URL** – You can create test bookings through the Direct Booking engine. Refer to the instructions and details provided in your development pack email.
* SiteMinder's **pmsXchange Postman Collection**

This testing and certification guide focuses on reservation creation using the **Postman collection scenarios**, which simulate reservations being sent from a booking channel to SiteMinder and then delivered to your PMS using “*RTC*” as the booking agent code. In the PMSX Postman Collection, we have created six reservation scenarios to help you test how your PMS handles reservations, modifications, and cancellations delivered by SiteMinder.

Refer to the [Reservation Push](/pmsxchange-api/reference/reservations/push) or [Reservation Pull](/pmsxchange-api/reference/reservations/pull) for further details on the reservation data you will receive.

{% hint style="warning" %}
Before you begin, you must fork SiteMinder's [pmsXchange Postman Collection](https://www.postman.com/siteminder-apis/pmsxchange/overview) and set up the environment with your given test details.

For security reasons, always use test credit card details and never real ones when testing reservations. Refer to [Test Credit Cards](/pmsxchange-api/additional-resources/reference-tables/test-credit-cards).
{% endhint %}

**Purpose**

* Verify that your PMS can successfully receive **reservations**, **modifications**, and **cancellations** from SiteMinder via pmsXchange (PUSH or PULL, depending on your configured method).
* Ensure that, for each message, the PMS can either **confirm receipt** or **report processing failure**.
* Ensure that your PMS sends OTA\_HotelAvailNotifRQ updates to SiteMinder with the **correct delta availability** after reservations, modifications, and cancellations are processed
  * Only delta updates are acceptable.
  * Check-out dates and any non-occupied dates must not be included in the availability update.

### – Create Test Reservations

**Scenario 1 – Reservation 1 (Single Reservation)**\
This scenario creates **Reservation 1** as a simple baseline booking. A single reservation is created for one room type and one rate plan for a 3-night stay.

**Verify that:**

* The reservation is successfully created in the PMS system.
* The PMS confirms the receipt.
* The PMS sends a **delta reduced availability update** (OTA\_HotelAvailNotifRQ) for the room type and dates in the reservation.

***

**Scenario 2 – Reservation 2 (Modify Date and Room Type)**\
Reservation 2 starts as a single reservation for one room type and one rate plan for 3 nights (Day 23, 24, 25), and will then be modified and cancelled in the sub-scenarios.

**Verify that:**

* The initial reservation is successfully created in the PMS system.
* The PMS confirms the receipt.
* The PMS sends a **delta reduced availability update** (OTA\_HotelAvailNotifRQ) for the room type and those dates in the reservation.

**Scenario 2.1 – Modify Dates**\
This step modifies **Reservation 2** by changing only the **stay dates**. The original reservation has a check-in on Day 23 for a 3-night stay. In this scenario, the check-in is moved to Day 24, while the length of stay (3 nights), room type, and rate plan all remain unchanged.

**Verify that:**

* The updated reservation in your PMS reflects the **new check-in date** (Day 24) and the correct 3-night stay.
* The PMS confirms the receipt.
* The PMS sends a **delta update** (OTA\_HotelAvailNotifRQ) that:
  * **Releases** availability for the original check-in date (Day 23).
  * **Reduces** availability for the newly occupied night (Day 25).

**Scenario 2.2 – Modify Room Type**\
This step modifies **Reservation 2** by changing only the **room type**. Using the reservation after Scenario 2.1 (check-in Day 24, 3-night stay), the booking is updated to a different room type, while the check-in date, length of stay, and rate plan remain unchanged.

**Verify that:**

* The reservation in your PMS now shows the **new room type**, with the same check-in/check-out dates, length of stay, and rate plan.
* The PMS confirms the receipt.
* The PMS sends a **delta update** (OTA\_HotelAvailNotifRQ) that:
  * **Increases** availability for the original room type for the occupied dates.
  * **Decreases** availability for the new room type for the same dates.

**Scenario 2.3 – Cancel Reservation 2**\
This step **cancels Reservation 2 completely**. The same reservation used in Scenarios 2.1 and 2.2 is now fully cancelled, releasing all previously booked room nights back to availability.

**Verify that:**

* The reservation status in your PMS is **cancelled**.
* The PMS confirms the receipt.
* The PMS sends a **delta update** (OTA\_HotelAvailNotifRQ) that **increases availability** for all cancelled room nights (correct room type and dates).

***

**Scenario 3 – Reservation 3 (Multiple Rooms – Different Room Types)**\
This scenario creates **Reservation 3** with **two different room types** under the same reservation ID. Both rooms share the same stay dates and are part of a single multi-room booking that will then be modified and cancelled in the sub-scenarios.

**Verify that:**

* The initial reservation is successfully created in the PMS system with **two rooms** (**two different room types**).
* The PMS confirms the receipt.
* The PMS sends a **delta reduced availability update** (OTA\_HotelAvailNotifRQ) for **both** room types and their dates in the reservation.

**Scenario 3.1 – Remove 1 Room**\
This step modifies **Reservation 3** by **removing one of the room types**, so that only one room remains active under the same reservation ID.

**Verify that:**

* The updated reservation in your PMS still has the same reservation ID, but now **only one active room** (one room type) remains.
* The PMS confirms the receipt.
* The PMS sends a **delta update** (OTA\_HotelAvailNotifRQ) that:
  * **Increases** availability for the removed room type for the affected dates.

**Scenario 3.2 – Add 2 Rooms**\
This step modifies **Reservation 3** from Scenario 3.1 by **adding 2 additional rooms** to the active reservation (for a total of 3 rooms under the same reservation ID).

**Verify that:**

* The updated reservation in your PMS still has the same reservation ID, now with **3 active rooms** (the original remaining room + 2 newly added rooms).
* The PMS confirms the receipt.
* The PMS sends a **delta reduced availability update** (OTA\_HotelAvailNotifRQ) for the additional added rooms and their dates.

**Scenario 3.3 – Cancel Reservation 3**\
This step **cancels Reservation 3 completely**. The multi-room reservation used in Scenarios 3, 3.1, and 3.2 is now fully cancelled, releasing all booked room nights back to availability.

**Verify that:**

* The reservation status in your PMS is **cancelled** for the entire multi-room booking.
* The PMS confirms the receipt.
* The PMS sends a **delta update** (OTA\_HotelAvailNotifRQ) that **increases availability** for all rooms and dates associated with Reservation 3.

***

**Scenario 4 – Reservation 4 (Multi Rooms – Different Rate Plans)**\
This scenario creates **Reservation 4** with **multiple rooms** on **different rate plans** under a single reservation ID.

Verify that:

* The reservation is successfully created in the PMS system, with **each room linked to its own rate plan**.
* The PMS confirms the receipt.
* The PMS sends a **delta reduced availability update** (OTA\_HotelAvailNotifRQ) for the booked dates.

***

**Scenario 5 – Reservation 5 (Multi Rooms – Back-to-back Stays on Different Rate Plans)**\
This scenario creates **Reservation 5** with **two rooms**, where the stays are **back-to-back** and use different rate plans.

**Verify that:**

* The reservation is successfully created in the PMS system.
* The PMS confirms the receipt.
* The PMS sends a **delta reduced availability update** (OTA\_HotelAvailNotifRQ) for the **occupied nights** and room type.

***

**Scenario 6 – Reservation 6 (Multi Rooms – Split Date Range)**\
This scenario creates **Reservation 6** with **two separate stays** under a single reservation ID, where the stays are not consecutive.

**Verify that:**

* The reservation is successfully created in the PMS system.
* The PMS confirms the receipt.
* The PMS sends a **delta reduced availability update** (OTA\_HotelAvailNotifRQ) only for the **occupied nights** of each stay, reflecting the **split date ranges**.

### – Validate Availability Updates (Optional but Recommended)

As a final self-certification step for the Reservations section, you can use the pmsXchange Postman Collections (***Room Level Avail. Res. Certification*** or ***Rate Level Avail. Res. Certification***) to validate that availability updates sent from your PMS back to SiteMinder are correct after each reservation, modification, and cancellation event.

Using the Postman collection to:

* **Get initial availability**&#x20;
  * Call **Get initial availability** for the relevant room type and dates to see the **current availability** stored in SiteMinder’s system received from the PMS.
* **Create the reservation scenario**
  * Run the corresponding **reservation scenario** (new booking, modification, or cancellation) from the pmsXchange Postman Collection so the booking is created, modified, or cancelled in SiteMinder and delivered to your PMS.&#x20;
* **Get updated availability**
  * **Call Get updated availability** for the same room type and dates to see the new availability stored in SiteMinder’s system after your PMS update.
* **Compare results**
  * Check that availability has **increased** or **decreased** only for the occupied nights.&#x20;

{% hint style="info" %}
**Note:** For the Reservation Certification scenarios, you can run the collections. The delay between scenarios is controlled by the **delayRun** variable in the *pmsx-api* environment.
{% endhint %}

***

### 5. Reservation Upload

**Purpose:**\
Verify that your PMS can actively and correctly upload reservations to SiteMinder for each supported reservation type (Walk‑in, SiteMinder‑originated, direct booking channel, CRS/GDS/wholesaler), using the correct POS and ID mapping so that SiteMinder can classify and enrich the data.

**Scenario 1 – ResStatus coverage**\
This scenario confirms that your PMS sends the supported `HotelReservation@ResStatus` values correctly for a standard reservation.

**Scenario 1.1  - New reserved reservation (base case)**

* In your PMS, create a new standard reservation. This scenario focuses on **ResStatus** coverage rather than a specific reservation type.
* Send a Reservation Upload to SiteMinder.

**Expected Upload:**

* `HotelReservation@ResStatus="Reserved"`
* `HotelReservation@CreateDateTime` is set to the reservation creation time.
* `HotelReservation@LastModifyDateTime` is equal to `CreateDateTime` for the first creation.
* All usual minimum reservation content is present:
  * `RoomStays` (room type, dates, rate plan, totals, etc.).
  * `ResGuests` (guest profile and contact details).
  * `ResGlobalInfo` (hotel code, reservation IDs, totals, etc.).

**Scenario 1.2 - Cancellation of that reservation**

* In your PMS, cancel the same reservation created in scenario 1.1.
* Send a Reservation Upload to SiteMinder.

**Expected Upload:**

* `HotelReservation@ResStatus="Cancelled"`&#x20;
* `HotelReservation@LastModifyDateTime` is updated to the cancellation time.
* The primary reservation identifier is the same as in Scenario 1.1 (for example, the PMS confirmation ID carried in `UniqueID` or `HotelReservationIDs`).
* Reservation content remains present as the original reservation.

**Scenario 1.3 - Other ResStatus values**\
If your PMS supports additional status values, repeat the above flow for:

* **In-house** – Check‑in the reservation, then upload the In‑house event.
* **No-show** – Allow the reservation to pass the check‑in deadline (for example, after nightly audit) so the reservation becomes No‑show, then upload that event.
* **Checked-Out** – Check out a reservation and upload the Checked‑Out event.

***

**Scenario 2 – Walk‑in reservations (PMS Reservation)**\
This scenario tests your system’s ability to upload Walk‑in reservations using the **`WalkInIndicator`** attribute.

**Scenario 2.1 - Walk-In, Same-day check-in**

* In your PMS, create a Walk‑in reservation with check‑in date = **today**
* Send a Reservation Upload to SiteMinder.

**Expected Upload:**

* Reservation type: **Walk‑in Reservation** (POS with PMS as source, `WalkInIndicator="true"` and PMS ID only).
* `HotelReservation@ResStatus="Reserved"`&#x20;
* `HotelReservation@WalkInIndicator="true"`&#x20;
* The PMS reservation ID is present (for example, `HotelReservationIDs/HotelReservationID ResID_Type="14"` with your PMS reservation ID).
* All minimum reservation content

**Scenario 2.2 - Cancellation of a Walk-in**&#x20;

* In your PMS, cancel the Walk‑In reservation created in Scenario 2.1.
* Send a Reservation Upload to SiteMinder.

**Expected Upload:**

* Expected reservation type: **Walk‑In Reservation**.
* `HotelReservation@ResStatus="Cancelled"`
* `HotelReservation@WalkInIndicator="true"` is still present (to identify the booking as a Walk‑in).
* The reservation ID used is the same as in Scenario 2.1.
* `LastModifyDateTime` reflects the cancellation time.

***

**Scenario 3 – Modifications / cancellations of reservations originally received from SiteMinder**\
This scenario confirms that your PMS can:

* Receive reservations from SiteMinder (via Reservations PUSH or PULL), and
* Later upload **modifications or cancellations** of those same reservations back to SiteMinder, preserving the SiteMinder reference.

**Scenario 3.1 - SiteMinder reservation → Deliver into PMS →&#x20;*****Modify*****&#x20;→ Upload**

* Create a test booking in SiteMinder (for example, via Direct Booking or the pmsXchange Postman Collection).
* In your PMS, **modify** that reservation received from SiteMinder (e.g. change stay dates, room type, etc.).
* Send a Reservation Upload back to SiteMinder.

**Expected Upload:**

* Reservation type: **SiteMinder Modification/Cancellation** (PMS ID + SiteMinder ID present)
* The same PMS ID and SiteMinder reservation ID are both present, for example:
  * PMS ID as `HotelReservationID ResID_Type="14"`
  * SiteMinder ID as `HotelReservationID ResID_Type="25"`&#x20;
* `HotelReservation@ResStatus="Reserved"` (if still active).
* `LastModifyDateTime` is updated to the modification time.
* The change is reflected correctly in `RoomStays` (dates, occupancy, rate, or room type, depending on the modification).

**Scenario 3.2 - SiteMinder reservation → Deliver into PMS →&#x20;*****Cancel*****&#x20;→ Upload**

* Repeat the first part of Scenario 3.1 (create in SiteMinder, deliver to PMS, confirm receipt).
* In your PMS, **cancel** the reservation.
* Send a Reservation Upload to SiteMinder.

**Expected Upload:**

* The same reservation ID linkage as in Scenario 3.1 is maintained (PMS ID + SiteMinder ID).
* `HotelReservation@ResStatus="Cancelled"`&#x20;
* `LastModifyDateTime` is updated to the cancellation time.

***

**Scenario 4 – Reservations from other sources → PMS → Reservation Upload**\
This scenario validates that **non‑SiteMinder** reservation sources supported by your PMS can also be uploaded to SiteMinder with the correct POS and ID mapping.

**Scenario 4.1 - Direct booking channel (non‑SiteMinder) → PMS → Upload**

* Create a reservation in your PMS from a **direct booking channel** that does not go through SiteMinder (PMS own booking engine or other non-SiteMinder direct source)
* Send a Reservation Upload to SiteMinder

**Expected Upload:**

* Reservation type: Direct Booking reservation that does not go through SiteMinder.
* POS / `BookingChannel` identify the direct booking channel:
  * `POS/Source/RequestorID Type="10" ID="PMSCODE"`&#x20;
  * `BookingChannel Primary="true" Type="7"` with `CompanyName/@Code` set to your direct channel code.
* `ResGlobalInfo/HotelReservationIDs` includes:
  * `HotelReservationID ResID_Type="14"` – PMS reservation ID.
  * `HotelReservationID ResID_Type="29"` – direct channel reservation ID (where applicable).
* `HotelReservation@ResStatus="Reserved"` on creation.

Then:

* Cancel the same reservation in your PMS and upload the cancellation.&#x20;
  * `HotelReservation@ResStatus="Cancelled"`
  * `LastModifyDateTime` is updated.
  * The same PMS and channel IDs are used.

**Scenario 4.2 - CRS / GDS / Wholesaler (non‑SiteMinder) → PMS → Upload**

* Create a reservation in your PMS from a CRS, GDS or wholesaler connection that does **not** go through SiteMinder.
* Send a Reservation Upload to SiteMinder.

**Expected Upload:**

* Reservation type: **CRS / GDS / Wholesaler Reservation.**
* POS reflects the CRS/GDS/wholesaler origin
  * Primary CRS / GDS / wholesaler:
    * `BookingChannel Primary="true" Type="5"` with  `CompanyName/@Code`.
  * Secondary booking agent / OTA (if applicable):
    * Additional `Source` with `BookingChannel Primary="false" Type="7"` and the agent code.
* `ResGlobalInfo/HotelReservationIDs` includes:
  * PMS reservation ID as `ResID_Type="14"`&#x20;
  * CRS / agent reference as `ResID_Type="29"` (where applicable).
* `HotelReservation@ResStatus="Reserved"` on creation.

Then:

* Cancel the same reservation in your PMS and upload the cancellation.
  * `HotelReservation@ResStatus="Cancelled"`
  * `LastModifyDateTime` is updated.
  * The same PMS and CRS/agent IDs are used.

{% hint style="warning" %}
**Important**: If your PMS sends reservations from a booking channel that is not listed in the [<mark style="color:$warning;">Booking Agent Codes</mark>](https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/booking-agent-codes) table, you must request a new booking agent code before using it in `POS/Source/BookingChannel/CompanyName/@Code`. Contact the SiteMinder Partner Integrations team with the booking agent / channel name to have a code created.
{% endhint %}

***

### 6. Reservation Import

**Purpose:**\
Verify that your PMS can successfully request a bulk import of active reservations from SiteMinder.  This request triggers a background job that queues these reservations and delivers them to the PMS via the standard [Reservation PUSH](/pmsxchange-api/reference/reservations/push) or [Reservation PULL](/pmsxchange-api/reference/reservations/pull) flow.&#x20;

1. Please reach out to the SiteMinder Partner Integrations team when you are ready to test this API.
2. The Partner Integrations team will trigger several bookings for you, then inform you when they are ready for collection.
3. From your PMS, call the **Reservation Import** endpoint to trigger the bulk import job. After the request is accepted, the reservations will be queued and delivered to your PMS via your standard Reservation PUSH or Reservation PULL flow.

### 7. Payment Transaction Record

**Purpose**:\
Verify that your PMS can retrieve payment transaction data from SiteMinder, correctly link each transaction to the corresponding reservation using the SiteMinder Reservation ID and Payment Context ID, and acknowledge processing success or failure using the Payment Transaction Record SOAP API.&#x20;

**Scenario 1 – Retrieve and confirm a card payment (charge)**

1. **Create a reservation with SiteMinder Pay enabled**

* Create a reservation for your SiteMinder test hotel using SiteMinder Direct Booking, or pmsXchange Postman Collection.
* Ensure the booking flows through SiteMinder and is delivered to your PMS via your standard Reservations PUSH or PULL flow.
* Confirm your PMS has stored:
  * `UniqueID Type="14"` (SiteMinder Reservation ID).
  * `HotelReservationID ResID_Type="34"` (Payment Context ID).

2. **Process a charge in SiteMinder**

* In the SiteMinder Platform, find this reservation created in step 1. and process a **charge** using SiteMinder Pay (for example, charge part or all of the reservation amount).
* This creates a **Payment Transaction Record** linked to the same Payment Context ID (ResID\_Type="34").

3. **Pull undelivered payment transactions**

* From your PMS, send `SM_HotelResPaymentReadRQ` on your regular schedule (for example, every 2–5 minutes) with `SelectionType="Undelivered"`.
* Use either:
  * PMS‑level (no HotelCode) to retrieve all hotels, or
  * Hotel‑level with the specific HotelCode used in your test.

4. **Process SM\_HotelResPaymentReadRS**

* In `SM_HotelResPaymentReadRS`, locate the `HotelResPayment` that matches your test reservation.
* Verify that:
  * It includes identifiers:
    * `UniqueID Type="14"` – SiteMinder Reservation ID.
    * `UniqueID Type="34"` – Payment Context ID.
  * `PaymentInfo@PaymentTransactionTypeCode="charge"`.
  * `PaymentInfo@PaymentType` indicates a card payment.
  * `PaymentAmount` (amount + currency) matches the charge you processed.
* Store this payment transaction in your PMS and link it to the correct reservation using the Type 14 and Type 34 IDs.

5. **Acknowledge successful processing**

* After successfully storing and linking the transaction, send `SM_HotelResPaymentResultRQ` to SiteMinder:
  * Include one `HotelResPaymentResult` per processed transaction with:
    * `@TransactionID` and `@HotelCode` from the original `HotelResPayment`.
    * `UniqueID Type="14"` – SiteMinder Reservation ID.
    * `UniqueID Type="34"` – Payment Context ID.
    * `UniqueID Type="40"` – your own **Delivery Confirmation ID** (unique per PMS confirmation).
  * Include `<Success/>` (no `<Errors>` in the same request).
* Verify you receive `SM_HotelResPaymentResultRS` with `<Success/>` and that the same transaction is **not returned again** in subsequent `SM_HotelResPaymentReadRQ` calls.

***

**Scenario 2 – Retrieve and confirm a refund**

1. **Reuse an existing charged reservation**

* Use the same reservation from Scenario 1 (with a successful charge), or create a new reservation and repeat the charge steps first.
* Confirm that your PMS has already:
  * Stored the reservation with `ResID_Type="14"` and `ResID_Type="34"`.
  * Stored at least one successful charge linked to that Payment Context ID.

2. **Process a refund in SiteMinder**

* In the SiteMinder Platform, process a **refund** for that reservation using SiteMinder Pay.
* You may perform:
  * A **full refund**, or
  * A **partial refund** (recommended) to ensure your PMS can handle updates to the running balance.

3. **Pull and process the refund transaction**

* As in Scenario 1, let your scheduled `SM_HotelResPaymentReadRQ` run and receive `SM_HotelResPaymentReadRS`.
* Locate the new `HotelResPayment` entry for this refund and verify that:
  * `UniqueID Type="14"` and `Type="34"` match the same reservation and Payment Context as in the original charge.
  * `PaymentInfo@PaymentTransactionTypeCode="refund"`&#x20;
* Update the reservation in your PMS to reflect the refund.

4. **Acknowledge the refund**

* Send `SM_HotelResPaymentResultRQ` with:
  * `HotelResPaymentResult` including the refund `TransactionID`, `HotelCode`, and the same UniqueIDs (Type 14, 34, and your Type 40 Delivery Confirmation ID).
  * A `<Success/>` element to confirm processing.
* Verify the refund transaction is not re‑delivered in future `SM_HotelResPaymentReadRQ` calls.

{% hint style="info" %}
For details on how to perform charge and refund in the UI, see: [Video: Process payments and refunds](https://help-platform.siteminder.com/en/articles/9856839-video-process-payments-and-refunds)
{% endhint %}

***

**Error handling (applies to both charge and refund)**

* If your PMS cannot process a specific transaction (charge or refund), send `SM_HotelResPaymentResultRQ` with an `<Errors>` block instead of `<Success/>`:
  * Include at least one `<Error>` with:
    * An appropriate error code from the standard error code table.
    * Error type and a brief human‑readable description (for example, “Reservation not found in PMS”).
  * SiteMinder will treat the transaction as **delivered with error** and will not send it again.
* Send **separate** result messages for successes and errors. Do not mix `<Success>` and `<Errors>` in the same request.

## Final Steps

Once all scenarios have passed, notify the Partner Integrations team. We will review your results and confirm when you can proceed to certification. If any issues are identified during the review, we will reach out to you directly to resolve them before moving forward.

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Error Handling

Learn how to handle and return error messages when using the pmsXchange API, including expected formats, retry strategies, and response codes.

Your PMS/RMS should have a strong error handling system that can queue and resend errors. Additionally, you need to inform hoteliers about any errors that impact the synchronization of their data through pmsXchange.

Ensure that your system waits for a response from SiteMinder before sending additional requests for the same site. Set an appropriate timeout duration, **between 60 and 120 seconds**, to allow requests to complete before retrying. This prevents unnecessary retries and ensures smooth communication.

### Application Level

If the response from SiteMinder contains an OTA RS message with an 'Error' element, it indicates that the update cannot be processed due to invalid data. Here are some common application-level error scenarios:

{% tabs %}
{% tab title="Missing element/attribute" %}
**Missing Required Elements or Attributes**: Adjust your implementation to ensure all required data is sent.

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <OTA_HotelAvailNotifRS Version="1.0" TimeStamp="2025-10-25T01:32:55+00:00" EchoToken="TEST9BA23FF4-2EE4-11EF-2426-09173F13E4C5" xmlns="http://www.opentravel.org/OTA/2003/05">
         <Errors>
            <Error Type="10">The content of element "AvailStatusMessages" is not complete. One of "AvailStatusMessage" is expected</Error>
         </Errors>
      </OTA_HotelAvailNotifRS>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <OTA_HotelAvailNotifRS Version="1.0" TimeStamp="2025-10-25T01:33:55+00:00" EchoToken="TEST9BA23FF4-2EE4-11EF-2426-09173F13E4C5" xmlns="http://www.opentravel.org/OTA/2003/05">
         <Errors>
            <Error Type="3" Code="450">The HotelCode length must be equal to or greater than 1</Error>
         </Errors>
      </OTA_HotelAvailNotifRS>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Incorrect Credentials" %}
**Incorrect Credentials**: Verify that the correct username and password are set in your PMS/CRS/RMS. If you believe the details are accurate, confirm them with our PMS Support team.

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <OTA_HotelAvailNotifRS Version="1.0" TimeStamp="2025-10-25T01:29:05+00:00" EchoToken="TEST9BA23FF4-2EE4-11EF-2426-09173F13E4C5" xmlns="http://www.opentravel.org/OTA/2003/05">
         <Errors>
            <Error Type="4">Authentication failed - PMS received request with invalid username/password</Error>
         </Errors>
      </OTA_HotelAvailNotifRS>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Invalid Hotel Code" %}
**Invalid Hotel Code**: Ensure the Hotel Code is entered correctly in your PMS. If you think the code is correct, contact our PMS Support team to verify it.

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <OTA_HotelAvailNotifRS Version="1.0" TimeStamp="2025-10-25T01:27:05+00:00" EchoToken="TEST9BA23FF4-2EE4-11EF-2426-09173F13E4C5" xmlns="http://www.opentravel.org/OTA/2003/05">
         <Errors>
            <Error Type="6">PMS is not authorized to access hotel with HotelCode=XXXXX</Error>
         </Errors>
      </OTA_HotelAvailNotifRS>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

Below is an outline of the OTA (OpenTravel) standard EWT and ERR codes that will be used alongside the error messages specified in each pmsXchange API response.

{% tabs %}
{% tab title="OTA Error Warning Types" %}

<table><thead><tr><th width="84">EWT</th><th width="203">Error Type</th><th>Description</th></tr></thead><tbody><tr><td>1</td><td>Unknown</td><td>Indicates an unknown error.</td></tr><tr><td>3</td><td>Biz rule</td><td>Indicates that the XML message has passed a low-level validation check, but that the business rules for the request message were not met.</td></tr><tr><td>4</td><td>Authentication</td><td>Indicates the message lacks adequate security credentials</td></tr><tr><td>6</td><td>Authorization</td><td>Indicates the message lacks adequate security credentials</td></tr><tr><td>10</td><td>Required field missing</td><td>Indicates that a required element or attribute, as defined by the schema or agreed upon by trading partners, is missing from the message. In the context of pmsXchange, this error will also be returned if the XML message does not conform to the data type restrictions specified by the XML schema.</td></tr><tr><td>12</td><td>Processing exception</td><td>Indicates that an undefined exception occurred during the processing of the request.</td></tr></tbody></table>
{% endtab %}

{% tab title="pmsXchange Error Descriptions" %}

<table><thead><tr><th width="210">Error Name</th><th>Error Description</th><th data-hidden></th></tr></thead><tbody><tr><td>Invalid Endpoint</td><td><code>Authentication failed - PMS does not exist</code></td><td></td></tr><tr><td>Invalid Requestor ID</td><td><code>Inconsistent PMS codes. PMS 'PMSCODE' does not match RequestorID 'PMSCODEX'</code></td><td></td></tr><tr><td>Invalid Credentials</td><td><code>Authentication failed - PMS received request with invalid username/password</code></td><td></td></tr><tr><td>Invalid Hotel Code</td><td><code>PMS is not authorized to access hotel with HotelCode=HOTELCODE</code></td><td></td></tr><tr><td>System error</td><td></td><td></td></tr><tr><td>Unable to process</td><td></td><td></td></tr></tbody></table>
{% endtab %}
{% endtabs %}

### Soap Faults

A SOAP fault can be returned in the event of an unexpected error, such as when the XML in a SOAP message cannot be parsed. The SOAP Fault will specify which party is at fault (CLIENT or SERVER).

{% tabs %}
{% tab title="Example" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring xml:lang="en">Invalid SOAP message</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Example" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring xml:lang="en">Namespace prefix s on Envelope is not defined</faultstring>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

### HTTP Error Handling

#### 4xx – Client Errors

4xx errors indicate that the request sent to SiteMinder is invalid. **These errors should not be retried, as resending the same message will continue to fail**. The partner must correct the payload, structure, or authentication details before attempting to send the request again. For a complete list of common 4xx errors and how to address them, refer to the [HTTP Error Handling](/pmsxchange-api/additional-resources/reference-tables/http-error-handling) page.

#### 5xx – Server Errors

5xx errors indicate a temporary issue on the server or an upstream dependency. **These errors are usually recoverable, and partners are expected to implement a retry strategy**. We recommend an exponential backoff approach (5s → 10s → 20s → 40s → then every 1 minute) until a minimum timeout of 30 minutes is reached. If delivery still fails after the retry period, please contact SiteMinder’s Application Operations team. More information on common 5xx responses is available in the [HTTP Error Handling](/pmsxchange-api/additional-resources/reference-tables/http-error-handling) page.

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# API Overview

Use this page to understand what each pmsXchange API operation does and what data it handles.

### Rooms and Rates <a href="#rooms-and-rates" id="rooms-and-rates"></a>

***

{% columns %}
{% column %}

#### SM -> PMS <a href="#sm-greater-than-pms" id="sm-greater-than-pms"></a>

`REST/JSON`&#x20;

Retrieve room type and rate plan mappings.

* GET Room Rates

View API Specification [→](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms)
{% endcolumn %}

{% column %}

#### PMS -> SM <mark style="color:red;">(Beta)</mark> <a href="#pms-greater-than-sm-beta" id="pms-greater-than-sm-beta"></a>

`REST/JSON`&#x20;

Share room type and rate plan mappings.

* GET Room Rates

View API Specification [→](/pmsxchange-api/reference/rooms-and-rates/pms-to-sm)
{% endcolumn %}
{% endcolumns %}

***

### Availability <a href="#availability" id="availability"></a>

***

{% columns %}
{% column %}

#### PMS -> SM

`SOAP/XML`&#x20;

Sync room inventory from your PMS to SiteMinder for channel distribution.

* Availability

View API Specification [→](/pmsxchange-api/reference/availability)
{% endcolumn %}

{% column %}

{% endcolumn %}
{% endcolumns %}

***

### Restrictions <a href="#restrictions" id="restrictions"></a>

***

{% columns %}
{% column %}

#### PMS -> SM <a href="#pms-greater-than-sm" id="pms-greater-than-sm"></a>

`SOAP/XML`

Sync booking restrictions from your PMS to SiteMinder for channel distribution.

* Stop Sell
* Minimum Length of Stay (MinLOS)
* Maximum Length of Stay (MaxLOS)
* Close to Arrival (CTA)
* Close to Departure (CTD)

View API Specification [→](/pmsxchange-api/reference/restrictions/pms-to-sm)
{% endcolumn %}

{% column %}

#### SM -> PMS <mark style="color:red;">(Beta)</mark> <a href="#sm-greater-than-pms-beta" id="sm-greater-than-pms-beta"></a>

`REST/JSON`&#x20;

Receive restriction updates pushed from SiteMinder directly to your PMS.

* Stop Sell
* Minimum Length of Stay (MinLOS)
* Maximum Length of Stay (MaxLOS)
* Close to Arrival (CTA)
* Close to Departure (CTD)

View API Specification [→](/pmsxchange-api/reference/restrictions/sm-to-pms)
{% endcolumn %}
{% endcolumns %}

***

### Rates <a href="#rates" id="rates"></a>

***

{% columns %}
{% column %}

#### PMS -> SM <a href="#pms-greater-than-sm-1" id="pms-greater-than-sm-1"></a>

`SOAP/XML`

Sync pricing from your PMS to SiteMinder for channel distribution.

* Per Day Pricing (PDP)
* Occupancy Based Pricing (OBP)

View API Specification [→](/pmsxchange-api/reference/rates/pms-to-sm)
{% endcolumn %}

{% column %}

#### SM -> PMS <mark style="color:red;">(Beta)</mark> <a href="#sm-greater-than-pms-beta-1" id="sm-greater-than-pms-beta-1"></a>

`REST/JSON`

Receive rate updates pushed from SiteMinder directly to your PMS.

* Per Day Pricing (PDP)
* Occupancy Based Pricing (OBP)

View API Specification [→](/pmsxchange-api/reference/rates/sm-to-pms)
{% endcolumn %}
{% endcolumns %}

***

### Reservations <a href="#reservations" id="reservations"></a>

***

{% columns %}
{% column %}

#### Push (SM -> PMS) <a href="#push-sm-greater-than-pms" id="push-sm-greater-than-pms"></a>

`SOAP/XML`

Receive reservations from SiteMinder directly to your PMS in real time.

* Reservation (Initial Delivery)
* Reservation Multi-Rooms
* Reservation Modifications
* Reservation Cancellations

View API Specification [→](/pmsxchange-api/reference/reservations/push)
{% endcolumn %}

{% column %}

#### Pull (SM -> PMS) <a href="#pull-sm-greater-than-pms" id="pull-sm-greater-than-pms"></a>

`SOAP/XML`

Retrieve reservations from SiteMinder by polling at regular 2–5 minute intervals.

* Reservation (Initial Delivery)
* Reservation Multi-Rooms
* Reservation Modifications
* Reservation Cancellations

View API Specification [→](/pmsxchange-api/reference/reservations/pull)
{% endcolumn %}
{% endcolumns %}

***

{% columns %}
{% column width="50%" %}

#### Upload (PMS -> SM) <a href="#upload-pms-greater-than-sm" id="upload-pms-greater-than-sm"></a>

`SOAP/XML`

Sync PMS reservations back to the SiteMinder Platform.

* Walk-in Reservations
* Direct Booking Channel Reservations
* CRS/GDS/Wholesaler Reservations
* SiteMinder Modification/Cancellation

View API Specification [→](/pmsxchange-api/reference/reservations/upload)
{% endcolumn %}

{% column width="50%" %}

#### Import <a href="#import" id="import"></a>

`REST/JSON`

Bulk import all active reservations during initial PMS integration setup.

* GET Reservation Import

View API Specification [→](/pmsxchange-api/reference/reservations/import)
{% endcolumn %}
{% endcolumns %}

***

### Payment Transaction Record <a href="#payment-transaction-record" id="payment-transaction-record"></a>

***

{% columns %}
{% column %}

#### SM -> PMS <a href="#sm-greater-than-pms-beta-1" id="sm-greater-than-pms-beta-1"></a>

`SOAP/XML`&#x20;

Retrieve payment transaction data from SiteMinder to your PMS.

* Reserve
* Charge
* Refund

View API Specification [→](/pmsxchange-api/reference/payment-transaction-record)
{% endcolumn %}

{% column %}

{% endcolumn %}
{% endcolumns %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Rooms and Rates


# SM -> PMS

Retrieve room type and rate plan configurations to map your PMS inventory with the SiteMinder Platform.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Rooms and Rates · **Direction:** SM → PMS · **Method:** Pull (PMS-initiated)
{% endhint %}

## What is Rooms and Rates (SM -> PMS)?

**Rooms and Rates (SM -> PMS)** is a retrieval method where the Property Management System (PMS) or Revenue Management System (RMS) request a list of configured room types and rate plans from the SiteMinder Platform. This integration ensures that the PMS can properly map its internal room and rate structures with the configurations set up for distribution across all connected channels, maintaining accurate inventory, pricing and reservation synchronization.

#### **Considerations**

* **Configuration Scope**: The `room-rates` endpoint returns only the room rates configured for the PMS on the SiteMinder Platform. This configuration is managed through Distribution > Connectivities > {PMS Name} > Rooms and Rates Mapping.
* **Rate Plan Support**: If your PMS does not support Rate Plans, the fields for `ratePlanName` and `ratePlanCode` will be empty in the response.
* **Optional Fields**: The `includedAdultOccupancy` field is optional and may be blank if hoteliers have not set this included occupancy value on the SiteMinder Platform.
* **Code Mapping**: The `roomTypeCode` returned by the `room-rates` endpoint must be used for both `RoomTypeCode` and `InvTypeCode` on the PMS side to ensure consistent inventory and reservation mapping.

{% hint style="warning" %}
**Authentication Requirements**: The REST components of the pmsXchange API only support PMS-level authentication, which means using the same credentials across all properties. If you’re currently using hotel-level authentication (credentials per property), we recommend switching to PMS-level to ensure compatibility with the REST endpoints.
{% endhint %}

## GET /core-api/pmses/{pmsCode}/hotels/{hotelCode}/room-rates

> Returns all configured room rates for specified hotelier.

```json
{"openapi":"3.0.3","info":{"title":"pmsx/core-api","version":"1.0.2"},"servers":[{"url":"https://tpi-pmsx.preprod.siteminderlabs.com"}],"security":[{"basicAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"}},"parameters":{"traceToken":{"name":"X-SM-TRACE-TOKEN","in":"header","description":"traceToken is logged with every log messages for this request","required":true,"schema":{"type":"string"}},"pmsCode":{"in":"path","name":"pmsCode","description":"pmsCode used to identify the pmsx partner","schema":{"type":"string","minLength":1,"maxLength":255},"required":true},"hotelCode":{"in":"path","name":"hotelCode","description":"hotelCode used to identify the hotelier","required":true,"schema":{"type":"string","minLength":1,"maxLength":255}}},"headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string"},"description":"trace token"}},"schemas":{"RoomRate":{"type":"object","allOf":[{"type":"object","properties":{"ratePlanName":{"type":"string","description":"The name of the Rate Plan"},"ratePlanCode":{"type":"string","description":"The rate plan mapping code of the room rate"},"roomTypeName":{"type":"string","description":"The name of the Room Type"},"roomTypeCode":{"type":"string","description":"The room type mapping code of the room rate"},"includedAdultOccupancy":{"type":"integer","description":"The number of guests included for the price for the room"}}}]},"Errors":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"Error":{"type":"object","additionalProperties":false,"properties":{"code":{"type":"string","description":"- `invalid` is a generic code indicating an integration property does not match the constraints required by an integration. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `min` indicates either the field value (numeric) or string length is too small for given integration property. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `max` indicates either the field value (numeric) or string length is too large for given integration property. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `required` indicates that a given property that was required, was not specified in the request. Typically used for integration properties. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `conflict` indicates you are trying to create a resource e.g. pmsHotel which is already present. You will typically have `meta.entity` populated which takes on values `pms`, `pmsHotel`. The `meta.code` field is populated when `meta.entity` is pms and the `meta.uuid` field is populated when `meta.entity` is `pmsHotel`\n- `too-many-requests` indicates that the client has exceeded its API quota. It should wait for at least the specified time in seconds which is provided in the `Retry-After` HTTP header\n- `server` generic error\n- `UnauthorizedError` happens when we cannot authenticate the user\n- `AccessDenied` happens when we know who the user is, but they do not have required permissions to perform the action"},"message":{"description":"additional information on the error","type":"string"},"meta":{"description":"Contains any additional information to enrich the error.\nAll properties are optional.","additionalProperties":true,"type":"object","properties":{"code":{"type":"string","description":"Typically populated with we get a conflict error for the entity pms or when pms or integration is not found"},"uuid":{"type":"string","description":"Typically populated when we get a conflict error for the entity pmsHotel or when pmsHotel or pmsRoomRate is not found"},"entity":{"type":"string","description":"typically populated when a conflict error is raised. Also present in not found errors too"},"field":{"type":"string","description":"name of the field which typically has a validation error."},"propertyName":{"type":"string","description":"populated when the `meta.field` is set the `integrationProperties`. This tells us the property name in question that the error is for."},"dataPath":{"type":"string","description":"returned when there is a syntactic error in the request. That is the request is not compliant with the route."}}}}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"Unauthorized":{"description":"Unauthorized","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"AccessDenied":{"description":"Access denied","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Not Found","headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"AlreadyExistsError":{"description":"Conflict, record already exists","headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"TooManyRequests":{"description":"Too Many Requests","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"ServiceUnavailableError":{"description":"Service Unavailable","headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}}},"paths":{"/core-api/pmses/{pmsCode}/hotels/{hotelCode}/room-rates":{"get":{"operationId":"getRoomRates","description":"Returns all configured room rates for specified hotelier.","tags":["RoomRates"],"parameters":[{"$ref":"#/components/parameters/traceToken"},{"$ref":"#/components/parameters/pmsCode"},{"$ref":"#/components/parameters/hotelCode"}],"responses":{"200":{"description":"OK","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RoomRate"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/AccessDenied"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/AlreadyExistsError"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}}}}
```

## Common Questions

<details>

<summary>What is the difference between <code>RoomTypeCode</code> and <code>InventoryTypeCode</code>?</summary>

Both identify the same room type, just used in different message types:

* `InvTypeCode` = Used to identify the room type in inventory updates (availability, restrictions, rates)
* `RoomTypeCode` = Used to identify the room type in reservations messages

Use the `roomTypeCode` from the `room-rates` endpoint for both.

</details>

<details>

<summary>Can I use the <code>room-rates</code> endpoint with hotel-level authentication?</summary>

No. The `room-rates` endpoint requires PMS-level authentication (same credentials for all properties).

If you're using hotel-level authentication, contact Partner Integrations to migrate to PMS-level.

</details>

<details>

<summary>How often should I call the <code>room-rates</code> endpoint?</summary>

During initial setup and when mapping changes occur.

This endpoint is for configuration retrieval, not real-time polling:

* Initial Integration: Pull room rates during PMS setup
* On Demand: When mapping issues are reported or rooms/rates are added
* Periodic Sync: Optional weekly or monthly check for configuration updates

Avoid polling frequently, room rate configurations don't change often.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# PMS -> SM

Share room type and rate plan configurations from your PMS with the SiteMinder Platform.

{% hint style="success" %}
This is a beta specification and subject to change. Reach out to our [Ecosystem Team](mailto:ecosystem.team@siteminder.com) if you wish to develop to this API.&#x20;
{% endhint %}

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Rooms and Rates · **Direction:** PMS → SM · **Method:** Pull (SM-initiated)
{% endhint %}

## What is Rooms and Rates (PMS -> SM)?

**Rooms and Rates (PMS -> SM)** is a retrieval method where SiteMinder requests a list of configured room types and rate plans directly from the Property Management System (PMS). This integration allows the PMS to share its room and rate mapping configuration with SiteMinder, including important metadata about rate setup types and data limitations, ensuring accurate distribution setup and synchronization across all connected channels.

{% hint style="warning" %}
To implement **Rooms and Rates (PMS -> SM)**, the PMS must certify for [Rooms and Rates (SM -> PMS)](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms).
{% endhint %}

#### **Considerations**

* **Direction of Integration**: Unlike the standard [Rooms and Rates (SM -> PMS)](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms) endpoint where the PMS pulls from SiteMinder, this endpoint is called by SiteMinder to retrieve configuration from the PMS.
* **Required Fields**: All fields in the `RoomRateMapping` object are required: `id`, `roomTypeCode`, `ratePlanCode`, `roomTypeName`, `ratePlanName`, `includedAdultOccupancy`, `maxAdultOccupancy`, `minRate`, `currencyCode` and `rateSetup`.
* **Rate Setup**: The `rateSetup` object has 2 fields
  * `type`  **-** This indicates how the rate is configured in the PMS and can be 1 of 2 values.
    * `Derived`: Rate is calculated from another rate (base rate). Derived rates should include `NO_RATES` in `unsupportedData`.&#x20;
    * `Manual`: Rate is manually managed and can receive updates.
  * `parentRatePlanCode` - The rate plan code the of the base rate this rate is derived from.&#x20;
    * If the rate is a `Derived` rate then `parentRatePlanCode` is required.&#x20;
* **Data Limitations**: Use the `unsupportedData` array to communicate limitations:
  * `NO_RATES`: No rate updates should be pushed to this room rate
  * `NO_UPDATES`: No updates of any kind should be pushed to this room rate

{% hint style="warning" %}
**Authentication Requirements**: The REST components of the pmsXchange API only support PMS-level authentication, which means using the same credentials across all properties. If you’re currently using hotel-level authentication (credentials per property), we recommend switching to PMS-level to ensure compatibility with the REST endpoints.
{% endhint %}

## Message Exchange Flow

The following diagram illustrates the asynchronous message flow:

<figure><img src="/files/usHEZOIwHjjOgsb2I8jo" alt=""><figcaption></figcaption></figure>

## Retrieve room rate mappings for a hotel

> Returns the current room rate mapping configuration for the specified hotel

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"servers":[{"url":"https://pmsx-partner.com","description":"Partner server"}],"security":[{"basicAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"}},"parameters":{"traceToken":{"name":"X-SM-TRACE-TOKEN","in":"header","description":"The unique identifier of the request (UUID), this traceToken is logged with this request.","required":true,"schema":{"type":"string"}},"hotelCode":{"name":"hotelCode","in":"path","required":true,"description":"Hotel identifier code","schema":{"type":"string"}},"pmsCode":{"name":"pmsCode","in":"path","required":true,"description":"PMSX partner code","schema":{"type":"string"}}},"schemas":{"RoomRateMappingList":{"type":"array","description":"List of room rate mappings","items":{"$ref":"#/components/schemas/RoomRateMapping"}},"RoomRateMapping":{"type":"object","required":["id","roomTypeCode","ratePlanCode","roomTypeName","ratePlanName","includedAdultOccupancy","maxAdultOccupancy","minRate","currencyCode","rateSetup"],"properties":{"id":{"type":"string","description":"Unique identifier for this room rate mapping"},"roomTypeCode":{"type":"string","description":"Unique code identifying the room type"},"ratePlanCode":{"type":"string","description":"Unique code identifying the rate plan"},"roomTypeName":{"type":"string","description":"Human-readable name of the room type"},"ratePlanName":{"type":"string","description":"Human-readable name of the rate plan"},"includedAdultOccupancy":{"type":"integer","minimum":1,"description":"Number of adults included in this rate"},"maxAdultOccupancy":{"type":"integer","minimum":1,"description":"Maximum number of adults allowed for this room type"},"minRate":{"type":"number","format":"double","minimum":0,"description":"Minimum rate allowed for this room rate mapping"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"rateSetup":{"type":"object","description":"Indicates how the rate is configured in the PMS. If the type is 'Derived' in the PMS, we would expect that you would also include 'NO_RATES' in unsupportedData as the rate is not updatable. We would also expect the parentRateCode to be provided for derived mappings.","required":["type"],"properties":{"type":{"type":"string","enum":["Derived","Manual"]},"parentRatePlanCode":{"type":"string","description":"Parent rate code used for derived mappings. Required when type is Derived."}}},"unsupportedData":{"type":"array","description":"List of unsupported data or limitations for this mapping","items":{"$ref":"#/components/schemas/UnsupportedDataItem"}}}},"UnsupportedDataItem":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"Code indicating the type of unsupported data. 'NO_UPDATES' will result in no updates pushed to this room rate. 'NO_RATES' will result in no rate updates pushed to this room rate.","enum":["NO_RATES","NO_UPDATES"]}}},"ErrorResponseList":{"type":"object","properties":{"errors":{"type":"array","description":"List errors","items":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}},"headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string","description":"The unique identifier of the request (UUID), this traceToken is logged with this request."}},"Time-Stamp":{"schema":{"type":"string","format":"date-time","description":"Response Timestamp."}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"AccessDenied":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"NotFound":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"TooManyRequests":{"description":"Too Many Requests","headers":{"Retry-After":{"description":"Number of seconds before SM should retry.","required":true,"schema":{"type":"integer","minimum":1}},"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServiceUnavailableError":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}}}},"paths":{"/pmses/{pmsCode}/hotels/{hotelCode}/room-rates/v1":{"get":{"summary":"Retrieve room rate mappings for a hotel","description":"Returns the current room rate mapping configuration for the specified hotel","parameters":[{"$ref":"#/components/parameters/traceToken"},{"$ref":"#/components/parameters/hotelCode"},{"$ref":"#/components/parameters/pmsCode"}],"responses":{"200":{"description":"PMS RoomRate Mapping Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomRateMappingList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/AccessDenied"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}}}}
```

## The ErrorResponse object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}}}}
```

## The ErrorResponseList object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"ErrorResponseList":{"type":"object","properties":{"errors":{"type":"array","description":"List errors","items":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}}}}
```

## The RoomRateMappingList object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RoomRateMappingList":{"type":"array","description":"List of room rate mappings","items":{"$ref":"#/components/schemas/RoomRateMapping"}},"RoomRateMapping":{"type":"object","required":["id","roomTypeCode","ratePlanCode","roomTypeName","ratePlanName","includedAdultOccupancy","maxAdultOccupancy","minRate","currencyCode","rateSetup"],"properties":{"id":{"type":"string","description":"Unique identifier for this room rate mapping"},"roomTypeCode":{"type":"string","description":"Unique code identifying the room type"},"ratePlanCode":{"type":"string","description":"Unique code identifying the rate plan"},"roomTypeName":{"type":"string","description":"Human-readable name of the room type"},"ratePlanName":{"type":"string","description":"Human-readable name of the rate plan"},"includedAdultOccupancy":{"type":"integer","minimum":1,"description":"Number of adults included in this rate"},"maxAdultOccupancy":{"type":"integer","minimum":1,"description":"Maximum number of adults allowed for this room type"},"minRate":{"type":"number","format":"double","minimum":0,"description":"Minimum rate allowed for this room rate mapping"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"rateSetup":{"type":"object","description":"Indicates how the rate is configured in the PMS. If the type is 'Derived' in the PMS, we would expect that you would also include 'NO_RATES' in unsupportedData as the rate is not updatable. We would also expect the parentRateCode to be provided for derived mappings.","required":["type"],"properties":{"type":{"type":"string","enum":["Derived","Manual"]},"parentRatePlanCode":{"type":"string","description":"Parent rate code used for derived mappings. Required when type is Derived."}}},"unsupportedData":{"type":"array","description":"List of unsupported data or limitations for this mapping","items":{"$ref":"#/components/schemas/UnsupportedDataItem"}}}},"UnsupportedDataItem":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"Code indicating the type of unsupported data. 'NO_UPDATES' will result in no updates pushed to this room rate. 'NO_RATES' will result in no rate updates pushed to this room rate.","enum":["NO_RATES","NO_UPDATES"]}}}}}}
```

## The UnsupportedDataItem object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"UnsupportedDataItem":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"Code indicating the type of unsupported data. 'NO_UPDATES' will result in no updates pushed to this room rate. 'NO_RATES' will result in no rate updates pushed to this room rate.","enum":["NO_RATES","NO_UPDATES"]}}}}}}
```

## The RoomRateMapping object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RoomRateMapping":{"type":"object","required":["id","roomTypeCode","ratePlanCode","roomTypeName","ratePlanName","includedAdultOccupancy","maxAdultOccupancy","minRate","currencyCode","rateSetup"],"properties":{"id":{"type":"string","description":"Unique identifier for this room rate mapping"},"roomTypeCode":{"type":"string","description":"Unique code identifying the room type"},"ratePlanCode":{"type":"string","description":"Unique code identifying the rate plan"},"roomTypeName":{"type":"string","description":"Human-readable name of the room type"},"ratePlanName":{"type":"string","description":"Human-readable name of the rate plan"},"includedAdultOccupancy":{"type":"integer","minimum":1,"description":"Number of adults included in this rate"},"maxAdultOccupancy":{"type":"integer","minimum":1,"description":"Maximum number of adults allowed for this room type"},"minRate":{"type":"number","format":"double","minimum":0,"description":"Minimum rate allowed for this room rate mapping"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"rateSetup":{"type":"object","description":"Indicates how the rate is configured in the PMS. If the type is 'Derived' in the PMS, we would expect that you would also include 'NO_RATES' in unsupportedData as the rate is not updatable. We would also expect the parentRateCode to be provided for derived mappings.","required":["type"],"properties":{"type":{"type":"string","enum":["Derived","Manual"]},"parentRatePlanCode":{"type":"string","description":"Parent rate code used for derived mappings. Required when type is Derived."}}},"unsupportedData":{"type":"array","description":"List of unsupported data or limitations for this mapping","items":{"$ref":"#/components/schemas/UnsupportedDataItem"}}}},"UnsupportedDataItem":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"Code indicating the type of unsupported data. 'NO_UPDATES' will result in no updates pushed to this room rate. 'NO_RATES' will result in no rate updates pushed to this room rate.","enum":["NO_RATES","NO_UPDATES"]}}}}}}
```

## Common Questions

<details>

<summary>What is the difference between <strong>Rooms and Rates (PMS -> SM)</strong> and <strong>Rooms and Rates (SM -> PMS)</strong> endpoint?</summary>

The direction of the API call is different:

* **Rooms and Rates (SM -> PMS)**: PMS calls SiteMinder to retrieve room and rate configuration
* **Rooms and Rates (PMS -> SM)**: SiteMinder calls the PMS to retrieve room and rate configuration

Rooms and Rates (PMS -> SM) also includes additional metadata like `rateSetupType` and `unsupportedData` to communicate rate configuration and limitations.

</details>

<details>

<summary>When should I use <code>NO_RATES</code> vs <code>NO_UPDATES</code> in unsupportedData?</summary>

Use these codes to communicate data limitations:

* `NO_RATES`: Use for derived rates or when only restrictions should be updated, but not pricing
* `NO_UPDATES`: Use when the room rate should not receive any updates (restrictions or rates)

For derived rates, set `rateSetupType` to "Derived" and include `NO_RATES` in `unsupportedData`.

</details>

<details>

<summary>How often will SiteMinder call this endpoint?</summary>

SiteMinder calls this endpoint during:

* Initial hotel setup and configuration
* On-demand when mapping issues are detected
* Periodic synchronization to detect configuration changes

This is not a real-time polling endpoint. The PMS should return the current configuration state when called.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Availability

Sync room inventory from your PMS to SiteMinder for channel distribution.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Availability · **Direction:** PMS → SM · **Method:** Push
{% endhint %}

## What is Availability?

**Availability** is an update method where the Property Management System (PMS) actively sends room inventory counts to the SiteMinder Platform for distribution across all connected channels. This integration ensures that all booking channels receive synchronized availability updates in real-time, preventing overbookings and maintaining accurate inventory control.

{% hint style="warning" %}
**Best Practice**: While availability and restrictions can technically be sent together using the `OTA_HotelAvailNotifRQ` message, we recommend sending them in separate requests for better processing and clarity.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>SiteMinder will provide a single global endpoint for all hotels for PMS to send update requests <code>OTA_HotelAvailNotifRQ</code> and receive confirmation responses <code>OTA_HotelAvailNotifRS</code>.</li><li><strong>Test Environment Endpoint:</strong> <a href="https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D">https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}</a></li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>SiteMinder will provide a single username/password for all hotels (PMS Level authentication).</li><li>PMS must include authentication credentials within the <strong>SOAP Security header</strong> of each request <code>OTA_HotelAvailNotifRQ</code>.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses will be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li></ul></td></tr></tbody></table>

## Message Exchange Flow

When your PMS needs to update room availability, it sends updates to SiteMinder using a synchronous SOAP/HTTPS exchange. SiteMinder then distributes these updates to all connected channels in real-time. Each update triggers a simple request-response cycle.

1. **Availability Update (PMS to SiteMinder)**: `OTA_HotelAvailNotifRQ` Delivers availability counts for specific room types and rate plans across defined date ranges.
2. **Confirmation Response (SiteMinder to PMS)**: `OTA_HotelAvailNotifRS` Confirms successful receipt and processing or reports validation errors.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from your PMS to SiteMinder endpoint. It contains the username and password credentials that we provide to the PMS during integration setup.

**Key Requirements:**

* **Validation**: Our endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Availability Update" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelAvailNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Success/>
		</OTA_HotelAvailNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Availability Update**

The `OTA_HotelAvailNotifRQ` message carries availability updates from your PMS to SiteMinder. Each message contains updates for exactly one hotel, with the ability to send multiple date ranges and room/rate combinations in a single request.

The message consists of an AvailStatusMessages container that holds individual AvailStatusMessage elements. Each AvailStatusMessage can update availability counts, for specific date ranges and rooms.

#### **Key Concepts**

**AvailStatusMessages**

* Container for all availability and restriction updates in the request.
* Always contains exactly one hotel's updates (identified by `HotelCode`).
* Can contain multiple `AvailStatusMessage` elements.

**AvailStatusMessage**

* Represents a single update instruction for specific dates.
* Must target room level (`InvTypeCode` only).

**Delta Updates**

* Only send data that has changed since the last update.
* Required for production to avoid system overload.
* Critical for efficient processing and performance.

**Bundling Updates**

* Consolidate consecutive dates with identical values into a single `AvailStatusMessage`.
* Focus each request on one room type.
* Use day-of-week flags to handle weekday/weekend variations within the same date range.

{% tabs %}
{% tab title="Availability" %}

* **Availability** is the number of rooms available for sale.
* Set at the room type level (`InvTypeCode`).
* Uses the `@BookingLimit` attribute to specify the count.
* All rate plans under the same room type share the same availability pool.

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage BookingLimit="10">
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP"/>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endtab %}
{% endtabs %}

### Update Multiple Values Examples

{% tabs %}
{% tab title="Availability Update" %}
Here is an example of an `OTA_HotelAvailNotifRQ` that updates only **Availability** for the same room in a single request:

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTEL">
		<AvailStatusMessage BookingLimit="10"> <!-- Availability -->
			<StatusApplicationControl Start="2025-03-01" End="2025-03-14" InvTypeCode="SUP"/>
		</AvailStatusMessage>
		<AvailStatusMessage BookingLimit="5"> <!-- Availability -->
			<StatusApplicationControl Start="2025-03-15" End="2025-03-31" InvTypeCode="SUP"/>
		</AvailStatusMessage>
		<!-- Additional AvailStatusMessage elements -->
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="285">Element / @Attribute</th><th width="139">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailNotifRQ</code></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>POS / Source / RequestorID</code></td><td></td><td align="center">1</td><td></td></tr><tr><td><code>@Type</code></td><td></td><td align="center">1</td><td>Fixed at <code>22</code> (ESRP)</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center"></td><td></td></tr><tr><td><code>AvailStatusMessages</code></td><td>Element</td><td align="center">1</td><td>Container for availability and restriction status messages.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>AvailStatusMessage</code></td><td>Element</td><td align="center">1..n</td><td>Single availability or restriction status message.</td></tr><tr><td><code>@BookingLimit</code></td><td>Integer ≥ 0</td><td align="center">0..1</td><td>Sets the number of rooms available for sale.</td></tr><tr><td><code>StatusApplicationControl</code></td><td>Element</td><td align="center">1</td><td>Contains date and room identification information. <strong>Note:</strong> No overlapping dates allowed.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>The start date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>The end date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@InvTypeCode</code></td><td>String</td><td align="center">1</td><td>Identifies the room type.</td></tr><tr><td><code>Mon</code>, <code>Tue</code>, <code>Weds</code>, <code>Thur</code>, <code>Fri</code>, <code>Sat</code>, <code>Sun</code></td><td>Boolean</td><td align="center">0..1</td><td><p>The <strong>day-of-week indicators</strong> are used to specify which days a rate update applies to. These indicators accept values of <code>"0"</code> or <code>"1"</code>, where:</p><ul><li><strong><code>"1"</code></strong> indicates the update applies to that day.</li><li><strong><code>"0"</code></strong> indicates the update does not apply to that day.</li></ul></td></tr><tr><td><code>LengthsOfStay</code></td><td>Element</td><td align="center">0..1</td><td>Used for Minimum Stay and Maximum Stay.</td></tr><tr><td><code>LengthOfStay</code></td><td>Element</td><td align="center">1..2</td><td>Single length of stay information.</td></tr><tr><td><code>@MinMaxMessageType</code></td><td>String</td><td align="center">1</td><td><p>Can be one of the following: <code>SetMinLOS</code></p><p><code>SetMaxLOS</code></p></td></tr><tr><td><code>@Time</code></td><td>Integer > 0</td><td align="center">1</td><td><p>Specifies the number of days related to a stay.</p><p><code>SetMinLOS</code> : Minimum days required for a stay.</p><p><code>SetMaxLOS</code> : Maximum days bookable.</p><p><code>@Time</code> value must be above <strong>0.</strong> To remove<code>MaxLOS</code>), set <code>@Time</code> to <strong>999</strong>.</p></td></tr><tr><td><code>RestrictionStatus</code></td><td>Element</td><td align="center">0..1</td><td>Used to restrict the room for Stop Sell, Closed to Arrivals, and Closed to Departure.</td></tr><tr><td><code>@Status</code></td><td>String</td><td align="center">1</td><td><p>Values:</p><p><code>Open</code> (opens room for sale)</p><p><code>Close</code> (closes room for sale)</p></td></tr><tr><td><code>@Restriction</code></td><td>String</td><td align="center">0..1</td><td><p>Values:</p><p><code>Arrival</code> (closes to arrival)</p><p><code>Departure</code> (closes to departure)</p><p>If no type is specified, assume a full close or open for the room rate.</p></td></tr></tbody></table>

## 2. **Confirmation Response**

{% tabs %}
{% tab title="Success" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
    <Success/>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2025-08-01T09:30:47+08:00" EchoToken="echo-abc123">
  <Errors>
    <Error Type="6">PMS is not authorized to access hotel with HotelCode=XXXX</Error>
  </Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2025-08-01T09:30:47+08:00" EchoToken="echo-abc123">
  <Errors>
    <Error Type="10">Status should be "Close" or "Open"</Error>
  </Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2025-08-01T09:30:47+08:00" EchoToken="echo-abc123">
  <Errors>
    <Error Type="10">Time should be a number between 1 and 9999</Error>
  </Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="259">Element / @Attribute</th><th width="108">Type</th><th width="70" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/error-warning-types-ewt">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Common Questions

<details>

<summary>Can I send availability and restrictions updates in the same message?</summary>

Yes, but send them separately for better processing.

The `OTA_HotelAvailNotifRQ` message supports both, but separate requests provide clearer error handling and easier troubleshooting.

</details>

<details>

<summary>How often should I send availability and restrictions updates?</summary>

Send delta updates in real-time as changes occur in your PMS (within 2 minutes).

Only send data that has changed - do not resend unchanged availability or restrictions.

</details>

<details>

<summary>Can I send full flushes daily to ensure complete synchronization?</summary>

No. Full flushes are only for initial setup or when requested by SiteMinder support.

Delta updates (changes only) are required in production. Frequent full flushes cause system overload and must be avoided.

</details>

<details>

<summary>When availability or restrictions change for a date, do I need to include all data in the message?</summary>

No. Send only what changed.

If availability changed, send only the new availability value. If a restriction changed, send only that restriction. Do not include unchanged data in your message.

Send changes only for the specific room type and rate plan that changed - do not include other room types or rate plans.

</details>

<details>

<summary>What happens when availability and restrictions conflict?</summary>

Restrictions take priority over availability.

**Priority order:**

1. **Stop Sell** - Overrides everything; if closed, room rate cannot be booked
2. **CTA/CTD** - Controls arrival/departure when Stop Sell is open
3. **Availability** - Room count when restrictions allow booking

**Both must allow booking:**

* Stop Sell = Close, Availability = 10 → Cannot book (restrictions block)
* Stop Sell = Open, Availability = 0 → Cannot book (no inventory)
* Stop Sell = Open, Availability = 10 → Can book ✓

Update availability and restrictions independently - stored availability activates when restrictions open.

</details>

<details>

<summary>Can I set different restrictions for different rate plans on the same room type?</summary>

Yes. Restrictions are set at the room rate level, while availability is set at the room type level.

**Availability (Room Level):**

* Applied to the entire room type (InvTypeCode only)
* All rate plans share the same availability pool
* Example: 10 Double Rooms available for ALL rate plans

**Restrictions (Room Rate Level):**

* Applied to specific room/rate combinations (InvTypeCode + RatePlanCode)
* Each rate plan can have independent restrictions
* Example: Double Room - BAR (Stop Sell = Close), Double Room - B\&B (Stop Sell = Open)

</details>

<details>

<summary>Does SiteMinder automatically reduce availability for all reservation types?</summary>

No. Only new bookings trigger automatic reduction for quick channel updates.

Your PMS must send availability updates via `OTA_HotelAvailNotifRQ` for all reservation types (Book, Modify, Cancel) - you are the master source of availability data.

</details>

<details>

<summary>How many dates in advance does SiteMinder support?</summary>

Up to 750 days in the future.

Properties can configure their inventory distribution window between 400-750 days based on their preferences.

</details>

<details>

<summary>Do you support Minimum/Maximum Stay Through?</summary>

No. pmsXchange only supports standard MinLOS/MaxLOS (applied on check-in date).

Stay Through restrictions (applied when any part of the reservation touches a date) are not currently supported.

</details>

<details>

<summary>Do you support Patterned Length of Stay (e.g., only 7, 14, 21, or 28 days)?</summary>

Not directly, but use multiple rate plans with different MinLOS values.

Example: Create "Weekly" (MinLOS = 7), "Bi-Weekly" (MinLOS = 14), and "Monthly" (MinLOS = 28) rate plans for the same room type, each with appropriate pricing.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Restrictions


# PMS -> SM

Sync room inventory and booking restrictions from your PMS to SiteMinder for channel distribution.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Restrictions · **Direction:** PMS → SM · **Method:** Push
{% endhint %}

## What is Restrictions (PMS -> SM)?

**Restrictions (PMS -> SM)** is an update method where the Property Management System (PMS) or Revenue Management System (RMS) actively send booking restrictions to the SiteMinder Platform for distribution across all connected channels. This integration ensures that all booking channels receive synchronized restriction updates in real-time, preventing overbookings and maintaining accurate inventory control.

Booking rules and limitations including stop sells, closed to arrival/departure, and minimum/maximum length of stay requirements.

{% hint style="warning" %}
**Best Practice**: While availability and restrictions can technically be sent together using the `OTA_HotelAvailNotifRQ` message, we recommend sending them in separate requests for better processing and clarity.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>SiteMinder will provide a single global endpoint for all hotels for PMS to send update requests <code>OTA_HotelAvailNotifRQ</code> and receive confirmation responses <code>OTA_HotelAvailNotifRS</code>.</li><li><strong>Test Environment Endpoint:</strong> <a href="https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D">https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}</a></li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>SiteMinder will provide a single username/password for all hotels (PMS Level authentication).</li><li>PMS must include authentication credentials within the <strong>SOAP Security header</strong> of each request <code>OTA_HotelAvailNotifRQ</code>.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses will be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li></ul></td></tr></tbody></table>

## Message Exchange Flow

When your PMS or RMS need to update booking restrictions, it sends updates to SiteMinder using a synchronous SOAP/HTTPS exchange. SiteMinder then distributes these updates to all connected channels in real-time. Each update triggers a simple request-response cycle.

1. **Restrictions Update (PMS to SiteMinder)**: `OTA_HotelAvailNotifRQ` Delivers booking restrictions (stop sells, CTA, CTD, min/max stay) for specific rate plans across defined date ranges.
2. **Confirmation Response (SiteMinder to PMS)**: `OTA_HotelAvailNotifRS` Confirms successful receipt and processing or reports validation errors.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from your PMS to SiteMinder endpoint. It contains the username and password credentials that we provide to the PMS during integration setup.

**Key Requirements:**

* **Validation**: Our endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Restrictions Update" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelAvailNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Success/>
		</OTA_HotelAvailNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Restrictions Update**

The `OTA_HotelAvailNotifRQ` message carries restriction updates from your PMS or RMS to SiteMinder. Each message contains updates for exactly one hotel, with the ability to send multiple date ranges and room/rate combinations in a single request.

The message consists of an AvailStatusMessages container that holds individual AvailStatusMessage elements. Each AvailStatusMessage can update booking restrictions for specific date ranges and room/rate combinations.

#### **Key Concepts**

**AvailStatusMessages**

* Container for all restriction updates in the request.
* Always contains exactly one hotel's updates (identified by `HotelCode`).
* Can contain multiple `AvailStatusMessage` elements.

**AvailStatusMessage**

* Represents a single update instruction for specific dates.
* Target room rate level (`InvTypeCode` + `RatePlanCode`).&#x20;

{% hint style="warning" %}
**New integrations must target rate level.** Targeting room level (`InvTypeCode` only) is not longer supported and it is maintained for backward compatibility.
{% endhint %}

**Restriction Independence**

* Each restriction type (Stop Sell, CTA, CTD, MinLOS, MaxLOS) operates independently, updating one restriction does not change or reset other restrictions.
* Only include the specific restrictions you want to change - unchanged restrictions retain their current values.

**Delta Updates**

* Only send data that has changed since the last update.
* Required for production to avoid system overload.
* Critical for efficient processing and performance.

**Bundling Updates**

* Consolidate consecutive dates with identical values into a single `AvailStatusMessage`.
* Focus each request on one room/rate combination.
* Use day-of-week flags to handle weekday/weekend variations within the same date range.

{% tabs %}
{% tab title="Stop Sell" %}

* **Stop Sell** controls whether a room rate is open or closed for sale.
* Set at the room rate level (`InvTypeCode` + `RatePlanCode`).
* Uses `RestrictionStatus` element with `Status="Open"` or `Status="Close"`

When Stop Sell has `Status="Close"`, it overrides all other settings. The room rate remains closed for sale even when availability (`BookingLimit`) is greater than zero and both CTA and CTD are set to `"Open"`.

{% code title="Room rate is stop sold for the specified date range." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<RestrictionStatus Status="Close"/>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}

{% code title="Room rate is open for sale for the specified date range." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="BAR"/>
			<RestrictionStatus Status="Open"/>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}
{% endtab %}

{% tab title="CTA" %}

* **Closed to Arrival (CTA)** prevents guests from checking in on specific dates.
* Set at the room rate level (`InvTypeCode` + `RatePlanCode`).
* Uses `RestrictionStatus` `Restriction="Arrival"` with `Status="Open"` or `Status="Close"`

{% code title="Room rate is closed for arrival (check-in) on 2025-03-01." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<RestrictionStatus Restriction="Arrival" Status="Close"/>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}

{% code title="Room rate is open for arrival  (check-in) on 2025-03-01." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="BAR"/>
			<RestrictionStatus Restriction="Arrival" Status="Open"/>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}
{% endtab %}

{% tab title="CTD" %}

* **Closed to Departure (CTD)** prevents guests from checking out on specific dates.
* Set at the room rate level (`InvTypeCode` + `RatePlanCode`).
* Uses `RestrictionStatus` `Restriction="Departure"` with `Status="Open"` or `Status="Close"`

{% code title="Room rate is closed for departure (check-out) on 2025-03-01." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTEL">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<RestrictionStatus Restriction="Departure" Status="Close"/>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}

{% code title="Room rate is open for departure (check-out) on 2025-03-01." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="BAR"/>
			<RestrictionStatus Restriction="Departure" Status="Open" />
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}
{% endtab %}

{% tab title="Min Stay" %}

* **Minimum Length of Stay** is the minimum nights required if arriving on specific dates.
* Set at the room rate level (`InvTypeCode` + `RatePlanCode`).
* Uses `LengthsOfStay`/`LengthOfStay` elements with `MinMaxMessageType="SetMinLOS"`
* `@Time` is the minimum stay duration in days.

Ensure logical consistency between **MinLOS** and **MaxLOS** values for the same date. A minimum stay requirement (MinLOS) can never exceed the maximum stay limit (MaxLOS). The PMS must validate this relationship before sending updates to SiteMinder.

{% code title="Setting MinLOS of 7 days." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<LengthsOfStay>
				<LengthOfStay MinMaxMessageType="SetMinLOS" Time="7"/>
			</LengthsOfStay>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}
{% endtab %}

{% tab title="Max Stay" %}

* **Maximum Length of Stay** is the maximum nights allowed if arriving on specific dates.
* Set at the room rate level (`InvTypeCode` + `RatePlanCode`).
* Uses `LengthsOfStay`/`LengthOfStay` elements with `MinMaxMessageType="SetMaxLOS"`
* `@Time` is the maximum stay duration in days.
* To remove `MaxLOS`, set `Time="999"` (not "0").

Ensure logical consistency between **MinLOS** and **MaxLOS** values for the same date. A minimum stay requirement (MinLOS) can never exceed the maximum stay limit (MaxLOS). The PMS must validate this relationship before sending updates to SiteMinder.

{% code title="Setting MaxLOS of 7 days." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<LengthsOfStay>
				<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="7"/>
			</LengthsOfStay>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}

{% code title="Removing MaxLOS." %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTEL">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<LengthsOfStay>
				<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="999"/>
			</LengthsOfStay>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}
{% endtab %}
{% endtabs %}

### Update Multiple Values Examples

Each `AvailStatusMessage` can be used to set **Minimum/Maximum Stays**, **CTA/CTD** and **Stop Sells** either individually or in combination. Each attribute such as `LengthOfStay` for minimum/maximum stays, and `RestrictionStatus` for stop sells and CTA/CTD can be updated independently within the same request.

{% tabs %}
{% tab title="Restrictions Only" %}
Here is an example of an `OTA_HotelAvailNotifRQ` that updates only **Minimum/Maximum Stay**, **Stop Sell** and **CTA/CTD** for the same room rate in a single request:

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTEL">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-14" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<LengthsOfStay>
				<LengthOfStay MinMaxMessageType="SetMinLOS" Time="2"/> <!-- Min Length of Stay -->
				<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="5"/> <!-- Max Length of Stay -->
			</LengthsOfStay>
			<RestrictionStatus Status="Close"/> <!-- Stop Sell -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-14" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<RestrictionStatus Restriction="Arrival" Status="Close"/> <!-- Close to Arrival (CTA) -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-14" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<RestrictionStatus Restriction="Departure" Status="Close"/> <!-- Close to Departure (CTD) -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-15" End="2025-03-31" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<LengthsOfStay>
				<LengthOfStay MinMaxMessageType="SetMinLOS" Time="1"/> <!-- Min Length of Stay -->
				<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="7"/> <!-- Max Length of Stay -->
			</LengthsOfStay>
			<RestrictionStatus Status="Open"/> <!-- Stop Sell -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-15" End="2025-03-31" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<RestrictionStatus Restriction="Arrival" Status="Open"/> <!-- Close to Arrival (CTA) -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-15" End="2025-03-31" InvTypeCode="SUP" RatePlanCode="GLD"/>
			<RestrictionStatus Restriction="Departure" Status="Open"/> <!-- Close to Departure (CTD) -->
		</AvailStatusMessage>
		<!-- Additional AvailStatusMessage elements -->
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endtab %}
{% endtabs %}

### Restrictions per Channel (Legacy)

{% hint style="warning" %}
**New integrations can not use  Restrictions per Channel.** This is not longer supported and it is maintained for backward compatibility.
{% endhint %}

The `DestinationSystemCodes` / `DestinationSystemCode` element can be used to specify which channel the restrictions update should be applied to.&#x20;

{% code overflow="wrap" expandable="true" %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage>
			<StatusApplicationControl Start="2025-03-01" End="2025-03-01" InvTypeCode="SUP" RatePlanCode="GLD">
				<DestinationSystemCodes>
					<DestinationSystemCode>EXP</DestinationSystemCode>
				</DestinationSystemCodes>
			</StatusApplicationControl>
			<RestrictionStatus Status="Close"/>
		</AvailStatusMessage>
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endcode %}

{% hint style="danger" %}
**If you are still sending Restrictions per Channel**, then all updates should follow the same rule. The same applies if you choose to send the restrictions at a room rate level only. It is not acceptable to send restriction updates per channel, and then overlay them with room rate level updates or vice versa.
{% endhint %}

<table><thead><tr><th width="285">Element / @Attribute</th><th width="139">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailNotifRQ</code></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>POS / Source / RequestorID</code></td><td></td><td align="center">1</td><td></td></tr><tr><td><code>@Type</code></td><td></td><td align="center">1</td><td>Fixed at <code>22</code> (ESRP)</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center"></td><td></td></tr><tr><td><code>AvailStatusMessages</code></td><td>Element</td><td align="center">1</td><td>Container for availability and restriction status messages.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>AvailStatusMessage</code></td><td>Element</td><td align="center">1..n</td><td>Single availability or restriction status message.</td></tr><tr><td><code>@BookingLimit</code></td><td>Integer ≥ 0</td><td align="center">0..1</td><td>Sets the number of rooms available for sale.</td></tr><tr><td><code>StatusApplicationControl</code></td><td>Element</td><td align="center">1</td><td>Contains date and room identification information. <strong>Note:</strong> No overlapping dates allowed.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>The start date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>The end date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@InvTypeCode</code></td><td>String</td><td align="center">1</td><td>Identifies the room type.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">1</td><td>Identifies the rate plan.</td></tr><tr><td><code>Mon</code>, <code>Tue</code>, <code>Weds</code>, <code>Thur</code>, <code>Fri</code>, <code>Sat</code>, <code>Sun</code></td><td>Boolean</td><td align="center">0..1</td><td><p>The <strong>day-of-week indicators</strong> are used to specify which days a rate update applies to. These indicators accept values of <code>"0"</code> or <code>"1"</code>, where:</p><ul><li><strong><code>"1"</code></strong> indicates the update applies to that day.</li><li><strong><code>"0"</code></strong> indicates the update does not apply to that day.</li></ul></td></tr><tr><td><code>LengthsOfStay</code></td><td>Element</td><td align="center">0..1</td><td>Used for Minimum Stay and Maximum Stay.</td></tr><tr><td><code>LengthOfStay</code></td><td>Element</td><td align="center">1..2</td><td>Single length of stay information.</td></tr><tr><td><code>@MinMaxMessageType</code></td><td>String</td><td align="center">1</td><td><p>Can be one of the following: <code>SetMinLOS</code></p><p><code>SetMaxLOS</code></p></td></tr><tr><td><code>@Time</code></td><td>Integer > 0</td><td align="center">1</td><td><p>Specifies the number of days related to a stay.</p><p><code>SetMinLOS</code> : Minimum days required for a stay.</p><p><code>SetMaxLOS</code> : Maximum days bookable.</p><p><code>@Time</code> value must be above <strong>0.</strong> To remove<code>MaxLOS</code>), set <code>@Time</code> to <strong>999</strong>.</p></td></tr><tr><td><code>RestrictionStatus</code></td><td>Element</td><td align="center">0..1</td><td>Used to restrict the room for Stop Sell, Closed to Arrivals, and Closed to Departure.</td></tr><tr><td><code>@Status</code></td><td>String</td><td align="center">1</td><td><p>Values:</p><p><code>Open</code> (opens room for sale)</p><p><code>Close</code> (closes room for sale)</p></td></tr><tr><td><code>@Restriction</code></td><td>String</td><td align="center">0..1</td><td><p>Values:</p><p><code>Arrival</code> (closes to arrival)</p><p><code>Departure</code> (closes to departure)</p><p>If no type is specified, assume a full close or open for the room rate.</p></td></tr></tbody></table>

## 2. **Confirmation Response**

{% tabs %}
{% tab title="Success" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
    <Success/>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2025-08-01T09:30:47+08:00" EchoToken="echo-abc123">
  <Errors>
    <Error Type="6">PMS is not authorized to access hotel with HotelCode=XXXX</Error>
  </Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2025-08-01T09:30:47+08:00" EchoToken="echo-abc123">
  <Errors>
    <Error Type="10">Status should be "Close" or "Open"</Error>
  </Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailNotifRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2025-08-01T09:30:47+08:00" EchoToken="echo-abc123">
  <Errors>
    <Error Type="10">Time should be a number between 1 and 9999</Error>
  </Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="259">Element / @Attribute</th><th width="108">Type</th><th width="70" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/error-warning-types-ewt">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Common Questions

<details>

<summary>Can I send availability and restrictions updates in the same message?</summary>

Yes, but send them separately for better processing.

The `OTA_HotelAvailNotifRQ` message supports both, but separate requests provide clearer error handling and easier troubleshooting.

</details>

<details>

<summary>How often should I send availability and restrictions updates?</summary>

Send delta updates in real-time as changes occur in your PMS (within 2 minutes).

Only send data that has changed - do not resend unchanged availability or restrictions.

</details>

<details>

<summary>Can I send full flushes daily to ensure complete synchronization?</summary>

No. Full flushes are only for initial setup or when requested by SiteMinder support.

Delta updates (changes only) are required in production. Frequent full flushes cause system overload and must be avoided.

</details>

<details>

<summary>When availability or restrictions change for a date, do I need to include all data in the message?</summary>

No. Send only what changed.

If availability changed, send only the new availability value. If a restriction changed, send only that restriction. Do not include unchanged data in your message.

Send changes only for the specific room type and rate plan that changed - do not include other room types or rate plans.

</details>

<details>

<summary>What happens when availability and restrictions conflict?</summary>

Restrictions take priority over availability.

**Priority order:**

1. **Stop Sell** - Overrides everything; if closed, room rate cannot be booked
2. **CTA/CTD** - Controls arrival/departure when Stop Sell is open
3. **Availability** - Room count when restrictions allow booking

**Both must allow booking:**

* Stop Sell = Close, Availability = 10 → Cannot book (restrictions block)
* Stop Sell = Open, Availability = 0 → Cannot book (no inventory)
* Stop Sell = Open, Availability = 10 → Can book ✓

Update availability and restrictions independently - stored availability activates when restrictions open.

</details>

<details>

<summary>Can I set different restrictions for different rate plans on the same room type?</summary>

Yes. Restrictions are set at the room rate level, while availability is set at the room type level.

**Availability (Room Level):**

* Applied to the entire room type (InvTypeCode only)
* All rate plans share the same availability pool
* Example: 10 Double Rooms available for ALL rate plans

**Restrictions (Room Rate Level):**

* Applied to specific room/rate combinations (InvTypeCode + RatePlanCode)
* Each rate plan can have independent restrictions
* Example: Double Room - BAR (Stop Sell = Close), Double Room - B\&B (Stop Sell = Open)

</details>

<details>

<summary>Does SiteMinder automatically reduce availability for all reservation types?</summary>

No. Only new bookings trigger automatic reduction for quick channel updates.

Your PMS must send availability updates via `OTA_HotelAvailNotifRQ` for all reservation types (Book, Modify, Cancel) - you are the master source of availability data.

</details>

<details>

<summary>How many dates in advance does SiteMinder support?</summary>

Up to 750 days in the future.

Properties can configure their inventory distribution window between 400-750 days based on their preferences.

</details>

<details>

<summary>Do you support Minimum/Maximum Stay Through?</summary>

No. pmsXchange only supports standard MinLOS/MaxLOS (applied on check-in date).

Stay Through restrictions (applied when any part of the reservation touches a date) are not currently supported.

</details>

<details>

<summary>Do you support release period?</summary>

No, there is no native release-period field, so a PMS wanting the same functional outcome must send Stop Sell for the release-window dates instead of a dedicated release-period value.

</details>

<details>

<summary>Do you support Patterned Length of Stay (e.g., only 7, 14, 21, or 28 days)?</summary>

Not directly, but use multiple rate plans with different MinLOS values.

Example: Create "Weekly" (MinLOS = 7), "Bi-Weekly" (MinLOS = 14), and "Monthly" (MinLOS = 28) rate plans for the same room type, each with appropriate pricing.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# SM -> PMS

Receive real-time restriction updates from SiteMinder to keep your PMS synchronized.

{% hint style="success" %}
This is a beta specification and subject to change. Reach out to our [Ecosystem Team](mailto:ecosystem.team@siteminder.com) if you wish to develop to this API.&#x20;
{% endhint %}

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Restrictions · **Direction:** SM → PMS · **Method:** Push
{% endhint %}

## What is Restrictions (SM -> PMS)?

**Restrictions (SM -> PMS)** is a push notification method where SiteMinder sends restriction updates directly to your Property Management System (PMS). This integration ensures that booking rules configured on the SiteMinder Platform are automatically synchronized to the PMS, maintaining accurate restriction management across all connected systems.

{% hint style="warning" %}
To implement Restrictions (SM -> PMS), the PMS must certify for [Restrictions (PMS -> SM)](/pmsxchange-api/reference/restrictions/pms-to-sm).
{% endhint %}

#### **Considerations**

* **Asynchronous Processing**: Due to high update volumes, your PMS must receive updates and queue them for offline processing rather than processing in real-time. This prevents blocking further updates from the PMSX application.
* **Message Volume**: Each message covers a specific room rate code combination with up to 760 dates per message, depending on the hotel's configured update period.
* **Selective Restriction Delivery**: SiteMinder only sends restriction types that your PMS supports, preventing unnecessary data transmission.
* **Code Mapping**: Use `invTypeCode` and `ratePlanCode` values that match the codes returned from the PMS Room and Rates endpoint.

{% hint style="warning" %}
**Authentication Requirements**: The REST components of the pmsXchange API only support PMS-level authentication, which means using the same credentials across all properties. If you’re currently using hotel-level authentication (credentials per property), we recommend switching to PMS-level to ensure compatibility with the REST endpoints.
{% endhint %}

## Hotel Room Rate Update (Restrictions)

> Endpoint to receive and process hotel room rate restrictions

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"servers":[{"url":"https://pmsx-partner.com","description":"Partner server"}],"security":[{"basicAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"}},"parameters":{"traceToken":{"name":"X-SM-TRACE-TOKEN","in":"header","description":"The unique identifier of the request (UUID), this traceToken is logged with this request.","required":true,"schema":{"type":"string"}},"hotelCode":{"name":"hotelCode","in":"path","required":true,"description":"Hotel identifier code","schema":{"type":"string"}},"pmsCode":{"name":"pmsCode","in":"path","required":true,"description":"PMSX partner code","schema":{"type":"string"}}},"schemas":{"HotelRestrictionsUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","restrictions"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"restrictions":{"type":"array","description":"List of inventory and rate updates for the hotel","items":{"$ref":"#/components/schemas/RestrictionsUpdate"}}}},"RestrictionsUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"minLOS":{"type":"number","description":"Minimum length of stay"},"maxLOS":{"type":"number","description":"Maximum length of stay"},"forwardMinStay":{"type":"number","description":"Currently unsupported, minimum length of stay through"},"forwardMaxStay":{"type":"number","description":"Currently unsupported, maximum length of stay through"},"close":{"type":"boolean","description":"Room rate closed"},"closeToArrival":{"type":"boolean","description":"Room rate closed to arrival"},"closeToDeparture":{"type":"boolean","description":"Room rate closed to departure"}}},"ErrorResponseList":{"type":"object","properties":{"errors":{"type":"array","description":"List errors","items":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}},"headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string","description":"The unique identifier of the request (UUID), this traceToken is logged with this request."}},"Time-Stamp":{"schema":{"type":"string","format":"date-time","description":"Response Timestamp."}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"AccessDenied":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"NotFound":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"TooManyRequests":{"description":"Too Many Requests","headers":{"Retry-After":{"description":"Number of seconds before SM should retry.","required":true,"schema":{"type":"integer","minimum":1}},"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServiceUnavailableError":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}}}},"paths":{"/pmses/{pmsCode}/hotels/{hotelCode}/restrictions/v1":{"post":{"parameters":[{"$ref":"#/components/parameters/traceToken"},{"$ref":"#/components/parameters/hotelCode"},{"$ref":"#/components/parameters/pmsCode"}],"summary":"Hotel Room Rate Update (Restrictions)","description":"Endpoint to receive and process hotel room rate restrictions","tags":["Hotel Rate Update"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelRestrictionsUpdate"}}}},"responses":{"200":{"description":"Restrictions Update received","headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/AccessDenied"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}}}}
```

## The HotelRateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"HotelRateUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","currencyCode","rates"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"rates":{"type":"array","description":"A list per day rate updates for the hotel","items":{"$ref":"#/components/schemas/RateUpdate"}}}},"RateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"rate":{"$ref":"#/components/schemas/OccupancyRateAmount"},"extraAdultAmount":{"$ref":"#/components/schemas/RateAmount"},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The RateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"rate":{"$ref":"#/components/schemas/OccupancyRateAmount"},"extraAdultAmount":{"$ref":"#/components/schemas/RateAmount"},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The HotelOccupancyBasedRateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"HotelOccupancyBasedRateUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","currencyCode","occupancyBasedRates"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"occupancyBasedRates":{"type":"array","description":"A list of occupancy based rate updates for the hotel","items":{"$ref":"#/components/schemas/OccupancyBasedRateUpdate"}}}},"OccupancyBasedRateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"occupancyBasedRates":{"type":"array","description":"All occupancy based rates for this date (IE 1-5 pax)","items":{"$ref":"#/components/schemas/OccupancyRateAmount"}},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The OccupancyBasedRateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"OccupancyBasedRateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"occupancyBasedRates":{"type":"array","description":"All occupancy based rates for this date (IE 1-5 pax)","items":{"$ref":"#/components/schemas/OccupancyRateAmount"}},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The OccupancyRateAmount object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}}}}}
```

## The RateAmount object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The HotelRestrictionsUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"HotelRestrictionsUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","restrictions"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"restrictions":{"type":"array","description":"List of inventory and rate updates for the hotel","items":{"$ref":"#/components/schemas/RestrictionsUpdate"}}}},"RestrictionsUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"minLOS":{"type":"number","description":"Minimum length of stay"},"maxLOS":{"type":"number","description":"Maximum length of stay"},"forwardMinStay":{"type":"number","description":"Currently unsupported, minimum length of stay through"},"forwardMaxStay":{"type":"number","description":"Currently unsupported, maximum length of stay through"},"close":{"type":"boolean","description":"Room rate closed"},"closeToArrival":{"type":"boolean","description":"Room rate closed to arrival"},"closeToDeparture":{"type":"boolean","description":"Room rate closed to departure"}}}}}}
```

## The RestrictionsUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RestrictionsUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"minLOS":{"type":"number","description":"Minimum length of stay"},"maxLOS":{"type":"number","description":"Maximum length of stay"},"forwardMinStay":{"type":"number","description":"Currently unsupported, minimum length of stay through"},"forwardMaxStay":{"type":"number","description":"Currently unsupported, maximum length of stay through"},"close":{"type":"boolean","description":"Room rate closed"},"closeToArrival":{"type":"boolean","description":"Room rate closed to arrival"},"closeToDeparture":{"type":"boolean","description":"Room rate closed to departure"}}}}}}
```

## The ErrorResponse object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}}}}
```

## The ErrorResponseList object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"ErrorResponseList":{"type":"object","properties":{"errors":{"type":"array","description":"List errors","items":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}}}}
```

## Common Questions

<details>

<summary>Why must I queue updates for offline processing instead of processing them immediately?</summary>

Due to the high volume of restriction updates, processing them synchronously would block SiteMinder from sending subsequent updates. Your PMS should:

1. Receive the update and return 200 OK immediately
2. Queue the update for asynchronous processing
3. Process the queued updates offline without blocking new incoming requests

This ensures continuous data flow and prevents update backlogs.

</details>

<details>

<summary>What happens if my PMS doesn't support a specific restriction type?</summary>

SiteMinder only sends restriction types that your PMS supports. During integration setup, you specify which restriction types your PMS can handle. Unsupported restriction types won't be included in the update messages, reducing unnecessary data transmission and processing.

</details>

<details>

<summary>How many dates can be included in a single update message?</summary>

Each message can contain up to 760 dates for a specific room rate code combination. The actual number depends on the update period configured by the hotel. Each date in the array represents a separate day's restrictions.

</details>

<details>

<summary>How should I handle the <code>Retry-After</code> header in 429 responses?</summary>

When your PMS returns a `429` (Too Many Requests) response, include the `Retry-After` header with the number of seconds SiteMinder should wait before retrying. This allows you to implement rate limiting and back-pressure when your system is under high load.

Example: `Retry-After: 60` tells SiteMinder to wait 60 seconds before sending the next update.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Rates


# PMS -> SM

Sync pricing from your PMS to SiteMinder for channel distribution.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Rates · **Direction:** PMS → SM · **Method:** Push
{% endhint %}

## What is Rates (PMS -> SM)?

**Rates (PMS -> SM)** is an update method where the Property Management System (PMS) actively sends room pricing information to the SiteMinder Platform for distribution across all connected channels. This integration ensures that all booking channels receive synchronized rate updates in real-time, maintaining accurate pricing across your distribution network and maximizing revenue opportunities.

The API supports two pricing models:

* **Per Day Pricing (PDP)**: Base rates are set for each individual day, allowing different prices on different days. Rate updates specify rates for each date within the defined range, enabling precise daily rate management.
* **Occupancy Based Pricing (OBP)**: Rates vary based on the number of occupants in the room. Rate updates include pricing for various occupancy levels (single, double, triple, etc.), providing detailed pricing based on the number of guests.

{% hint style="warning" %}
**Pricing Model Configuration**: The pricing model (PDP or OBP) is configured at the PMS/RMS level and applies to all properties connected to your integration. You cannot have some properties using Per Day Pricing while others use Occupancy Based Pricing.

**For partners migrating from PDP to OBP**: The **Included Occupancy** value must be set by each property in their SiteMinder Platform for all room rates before sending OBP updates.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>SiteMinder will provide a single global endpoint for all hotels for PMS to send update requests <code>OTA_HotelRateAmountNotifRQ</code> and receive confirmation responses <code>OTA_HotelRateAmountNotifRS</code>.</li><li><strong>Test Environment Endpoint:</strong> <a href="https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D">https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}</a></li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>SiteMinder will provide a single username/password for all hotels (PMS Level authentication).</li><li>PMS must include authentication credentials within the <strong>SOAP Security header</strong> of each request <code>OTA_HotelRateAmountNotifRQ</code>.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses will be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li></ul></td></tr></tbody></table>

## Message Exchange Flow

When your PMS needs to update room pricing, it sends updates to SiteMinder using a synchronous SOAP/HTTPS exchange. SiteMinder then distributes these updates to all connected channels in real-time. Each update triggers a simple request-response cycle.

1. **Rates Update (PMS to SiteMinder)**: `OTA_HotelRateAmountNotifRQ`\
   Delivers rate values for specific room types and rate plans across defined date ranges. Rates can be configured as Per Day Pricing (PDP) with fixed amounts, or Occupancy Based Pricing (OBP) with rates varying by guest count.
2. **Confirmation Response (SiteMinder to PMS)**: `OTA_HotelRateAmountNotifRS`\
   Confirms successful receipt and processing or reports validation errors.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from your PMS to SiteMinder endpoint. It contains the username and password credentials that we provide to the PMS during integration setup.

**Key Requirements:**

* **Validation**: Our endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Rates Update" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelRateAmountNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Success/>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Rates Update**

The `OTA_HotelRateAmountNotifRQ` message carries rate updates from your PMS or RMS to SiteMinder. Each message contains updates for exactly one hotel, with the ability to send multiple date ranges and room/rate combinations in a single request.

The message consists of an RateAmountMessages container that holds individual RateAmountMessage elements. Each RateAmountMessage can update rates for specific date ranges and room/rate combinations.

#### **Key Concepts**

**RateAmountMessages**

* Container for all rate updates in the request.
* Always contains exactly one hotel's updates (identified by `HotelCode`).
* Can contain multiple `RateAmountMessage` elements.

**RateAmountMessage**

* Represents a single update instruction for specific dates.
* Target room rate level (`InvTypeCode` + `RatePlanCode`).&#x20;

{% hint style="warning" %}
**New integrations must target rate level.** Targeting room level (`InvTypeCode` only) is not longer supported and it is maintained for backward compatibility.
{% endhint %}

**Delta Updates**

* Only send data that has changed since the last update.
* Required for production to avoid system overload.
* Critical for efficient processing and performance.

**Bundling Updates**

* Consolidate consecutive dates with identical values into a single `RateAmountMessage`.
* Focus each request on one room/rate combination.
* Use day-of-week flags to handle weekday/weekend variations within the same date range.

{% hint style="info" %}
To set **Rates**, it is mandatory to include the `@CurrencyCode` attribute in the `RateAmountMessage`. The rate value provided will be applied directly to SiteMinder **without** any currency conversion by SiteMinder. Therefore, ensure that the specified rate is in the correct currency as no conversion will be performed.
{% endhint %}

### Per Day Pricing (PDP) <a href="#per-day-pricing" id="per-day-pricing"></a>

PDP refers to a pricing model where rates are set for each individual day. Under this model, the rate for a room rate is determined on a daily basis, allowing for different prices on different days. The rate updates for PDP will specify rates for each date within the defined range, allowing for precise daily rate management.

{% tabs %}
{% tab title="Per Day Pricing" %}

```xml
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<RateAmountMessages HotelCode="HOTEL">
		<RateAmountMessage>
			<StatusApplicationControl InvTypeCode="SUP" RatePlanCode="BAR"/>
			<Rates>
				<Rate CurrencyCode="AUD" Start="2025-03-01" End="2025-03-14">
					<BaseByGuestAmts>
						<BaseByGuestAmt AmountAfterTax="123.00"/> <!-- Base Rate -->
					</BaseByGuestAmts>
				</Rate>
			</Rates>
		</RateAmountMessage>
		<!-- Additional RateAmountMessage elements -->
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}
{% endtabs %}

### Occupancy Based Pricing (OBP)

OBP is a pricing model where rates vary based on the number of occupants in the room. Under this model, the rate changes depending on the number of guests staying in the room. The Rate updates for OBP will include rates for various occupancy levels, providing detailed pricing based on the number of guests. The below additional functionalities are supported:

* Extra Adult Rate
* Extra Child Rate

{% tabs %}
{% tab title="Occupancy Based Pricing" %}

* **Only adult occupancy rates** are supported, indicated by `@AgeQualifyingCode="10"`. Child occupancy rates are **not** supported in the primary rate structure.
* The `@NumberOfGuests` attribute must specify **adult occupancy** as a positive integer between **1 and 5**. Sending a value greater than **5** will result in an error.
* `BaseByGuestAmt` must include the occupancy level that matches the Included Occupancy configured on the SiteMinder room rate. If this occupancy level is missing, the update will not be applied. \
  \
  E.g. if Included Occupancy = 2, the OBP update message must include: \
  `<BaseByGuestAmt AgeQualifyingCode="10"`` `**`NumberOfGuests="2"`**` ``AmountAfterTax="200.00"/>` among the occupancy levels.\
  \
  To verify the expected Included Occupancy value, you can retrieve the room rate configuration via the [Rooms and Rates (SM -> PMS)](https://developer.siteminder.com/pmsxchange-api/reference/rooms-and-rates/sm-to-pms) endpoint and check includedAdultOccupancy.
* While child occupancy rates are not directly supported in the primary rate setup, the `AdditionalGuestAmounts` element provides a way to include specific charges for extra adults and children as needed.

{% hint style="info" %}
**Best practice:** Send all supported adult occupancy levels from 1 to 5 in every OBP update message.
{% endhint %}

```xml
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<RateAmountMessages HotelCode="HOTEL">
		<RateAmountMessage>
			<StatusApplicationControl InvTypeCode="SUP" RatePlanCode="BAR"/>
			<Rates>
				<Rate CurrencyCode="AUD" Start="2025-03-01" End="2025-03-14">
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="1" AmountAfterTax="100.00"/>
						<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="2" AmountAfterTax="200.00"/>
						<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="3" AmountAfterTax="250.00"/>
						<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="4" AmountAfterTax="300.00"/>
						<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="5" AmountAfterTax="350.00"/>
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="10" Amount="50"/> <!-- Extra Adult Rate -->
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="10"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
				</Rate>
			</Rates>
		</RateAmountMessage>
		<!-- Additional RateAmountMessage elements -->
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}
{% endtabs %}

### Migrate from PDP to OBP <a href="#migrate-from-pdp-to-obp" id="migrate-from-pdp-to-obp"></a>

Existing partners transitioning from **Per Day Pricing** to **Occupancy Based Pricing**:

**Included Occupancy Requirement**: The **Included Occupancy** value must be set by each property in their SiteMinder Platform for all room rates before sending OBP updates.

{% hint style="warning" %}
**Simplifying Property Configuration**: SiteMinder is developing tools to streamline the Included Occupancy setup process. Partners implementing OBP must also certify the [**PMS** **Rooms and Rates**](/pmsxchange-api/reference/rooms-and-rates/pms-to-sm) component, which will enable automated configuration in the future.
{% endhint %}

#### Migration Process:

1. **Build and Certify OBP** in test environment with `BaseByGuestAmts` per occupancy (1-5) and optional `AdditionalGuestAmounts`
2. **Property Configuration:** Included Occupancy must be set in SiteMinder Platform for all properties connected to your system for all room rates.
3. **Coordinate Cutover:** As migration is PMS level, affecting all properties under your PMS code simultaneously.
4. **Deploy and Switch:** SiteMinder switches pricing model during agreed window; all rate updates must use OBP format after cutover.

{% hint style="info" %}
If properties want to maintain flat per day pricing, send the same rate amount for all occupancies in OBP format, this behaves like PDP but uses the OBP message structure.
{% endhint %}

### Rates per Channel (Legacy)

{% hint style="warning" %}
**New integrations can not use Rates per Channel.** This is not longer supported and it is maintained for backward compatibility.
{% endhint %}

The `DestinationSystemCodes` / `DestinationSystemCode` element can be used to specify which channel the rate udpates should be applied to.&#x20;

{% code overflow="wrap" expandable="true" %}

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<RateAmountMessages HotelCode="HOTEL">
		<RateAmountMessage>
			<StatusApplicationControl InvTypeCode="SUP" RatePlanCode="BAR">
				<DestinationSystemCodes>
					<DestinationSystemCode>EXP</DestinationSystemCode>
				</DestinationSystemCodes>
				<Rates>
					<Rate CurrencyCode="AUD" Start="2025-03-01" End="2025-03-14">
						<BaseByGuestAmts>
							<BaseByGuestAmt AmountAfterTax="123.00"/>
							<!-- Base Rate -->
						</BaseByGuestAmts>
					</Rate>
				</Rates>
			</RateAmountMessage>
			<!-- Additional RateAmountMessage elements -->
		</RateAmountMessages>
	</OTA_HotelRateAmountNotifRQ>
```

{% endcode %}

{% hint style="danger" %}
**If you are still sending Rates per Channel**, then all updates should follow the same rule. The same applies if you choose to send the rates at a room rate level only. It is not acceptable to send rate updates per channel, and then overlay them with room rate level updates or vice versa.
{% endhint %}

<table><thead><tr><th width="268">Element/Attribute</th><th width="108">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelRateAmountNotifRQ</code></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>POS / Source / RequestorID</code></td><td></td><td align="center">1</td><td></td></tr><tr><td><code>@Type</code></td><td></td><td align="center">1</td><td>Fixed at <code>22</code> (ESRP)</td></tr><tr><td><code>@ID</code></td><td></td><td align="center">1</td><td></td></tr><tr><td><code>RateAmountMessages</code></td><td>Element</td><td align="center">1</td><td>Container for rate status messages.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>RateAmountMessage</code></td><td>Element</td><td align="center">1..n</td><td>Single rate status message.</td></tr><tr><td><code>StatusApplicationControl</code></td><td>Element</td><td align="center">1</td><td>Contains date and room identification information. <strong>Note:</strong> No overlapping dates allowed.</td></tr><tr><td><code>@InvTypeCode</code></td><td>String</td><td align="center">1</td><td>Identifies the room.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">1</td><td>Identifies the rate.</td></tr><tr><td><code>Rates</code></td><td>Element</td><td align="center">1</td><td>Container for rate information.</td></tr><tr><td><code>Rate</code></td><td>Element</td><td align="center">1</td><td>Contains individual rate information.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>The start date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>The end date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>Mon</code>, <code>Tue</code>, <code>Weds</code>, <code>Thur</code>, <code>Fri</code>, <code>Sat</code>, <code>Sun</code></td><td></td><td align="center">0..1</td><td><p>The <strong>day-of-week indicators</strong> are used to specify which days a rate update applies to. These indicators accept values of <code>"0"</code> or <code>"1"</code>, where:</p><ul><li><strong><code>"1"</code></strong> indicates the update applies to that day.</li><li><strong><code>"0"</code></strong> indicates the update does not apply to that day.</li></ul></td></tr><tr><td><code>BaseByGuestAmts</code></td><td>Element</td><td align="center">1</td><td>Base charge for a given number of guests.</td></tr><tr><td><code>BaseByGuestAmt</code></td><td>Element</td><td align="center">1</td><td>Contains individual rate amounts.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td><p>Either <code>@AmountAfterTax</code> or <code>@AmountBeforeTax</code> must be included.</p><p>Positive decimal value for the rate amount after tax.</p></td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>Either <code>@AmountAfterTax</code> or <code>@AmountBeforeTax</code> must be included. Positive decimal value for the rate amount after tax.</td></tr><tr><td><code>@NumberOfGuests</code></td><td>Integer</td><td align="center">0..1</td><td>Number of guests in the room. <strong>Mandatory for OBP</strong>.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Element</td><td align="center">0..1</td><td><p>Age qualification for the rate:</p><p><code>10</code> Adult</p><p><strong>Mandatory for OBP</strong>.</p></td></tr><tr><td><code>AdditionalGuestAmounts</code></td><td>Element</td><td align="center">0..1</td><td><strong>For OBP:</strong> Additional charges for extra guests based on age qualification.</td></tr><tr><td><code>AdditionalGuestAmount</code></td><td>Element</td><td align="center">0..2</td><td><strong>For OBP:</strong> Contains details of extra guest charges.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>String</td><td align="center">1</td><td><p>Age qualification for the extra guest charge:</p><p><code>10</code> Adult</p><p><code>8</code> Child</p></td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">1</td><td>Extra charge amount.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr></tbody></table>

## 2. **Confirmation Response**

{% tabs %}
{% tab title="Success" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Success/>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Authentication Error" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Errors>
				<Error Type="4">Authentication failed - PMS received request with invalid username/password</Error>
    			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Incorrect HotelCode" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Errors>
				<Error Type="6">PMS is not authorized to access hotel with HotelCode=XXXXX</Error>
    			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Rates OBP Error" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:41+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Errors>
				<Error Type="3">NumberOfGuests must be equal or between 1 to 5</Error>
    			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="269">Element / @Attribute</th><th width="108">Type</th><th width="59" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelRateAmountNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/error-warning-types-ewt">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Common Questions

<details>

<summary>What is the difference between PDP and OBP?</summary>

* PDP (Per Day Pricing): Single rate per room per night.\
  Example: $100/night for a Double Room (any occupancy)
* OBP (Occupancy Based Pricing): Rates vary by guest count.\
  Example: $80 (1 guest), $100 (2 guests), $120 (3 guests), $140 (4 guests), $160 (5 guests).

Choose the pricing model that matches how your PMS stores rates. You only need to certify one model during integration.

</details>

<details>

<summary>How often should I send rates updates?</summary>

Send delta updates in real-time as changes occur in your PMS (within 2 minutes).

Only send data that has changed - do not resend unchanged rates.

</details>

<details>

<summary>Can I send full flushes daily to ensure complete synchronization?</summary>

No. Full flushes are only for initial setup or when requested by SiteMinder support.

Delta updates (changes only) are required in production. Frequent full flushes cause system overload and must be avoided.

</details>

<details>

<summary>When rates change for a date, do I need to include all data in the message?</summary>

No. Send changes only for the specific room type and rate plan that changed - do not include other room types or rate plans.

</details>

<details>

<summary>How many dates in advance does SiteMinder support?</summary>

Up to 750 days in the future.

Properties can configure their inventory distribution window between 400-750 days based on their preferences.

</details>

<details>

<summary>Do you support Weekly, Monthly or Package Rates?</summary>

Only daily rates are supported.

* **Weekly/Monthly**: Not supported - send daily rates instead
* **Packages** (room + extras): Include all charges in your daily rate amount

</details>

<details>

<summary>How do I send Extra / Supplement / Discount rates to SiteMinder?</summary>

Send your full daily rate including all extras - SiteMinder does not support separate supplement charges.

**Your rate should include:**

* Base room rate
* Any included extras (breakfast, parking, etc.)
* Any supplements or add-ons

**Channel discounts/promotions:** Managed by channels, not sent via pmsXchange.

</details>

<details>

<summary>Do you support Seasonal Rates?</summary>

pmsXchange does not currently support Seasonal Rates. However, you may use Stop Sell restrictions to control when rate plans are available.

Create separate rate plans for each season and use Stop Sell to open/close them for the appropriate date ranges.

</details>

<details>

<summary>For OBP, is pricing per adult or per guest (adults + children)?</summary>

Per adult only. `NumberOfGuests` represents the number of adults in the room.

Use `AgeQualifyingCode="10"` with `NumberOfGuests` (1-5) to specify rates for different adult counts. Child charges are handled separately using the `AdditionalGuestAmounts` element.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# SM -> PMS

Receive real-time rate updates from SiteMinder to keep your PMS synchronized.

{% hint style="success" %}
This is a beta specification and subject to change. Please reach out to our [Ecosystem Team](mailto:ecosystem.team@siteminder.com) if you wish to develop to this API.&#x20;
{% endhint %}

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Rates · **Direction:** SM → PMS · **Method:** Push
{% endhint %}

## What is Rates (SM -> PMS)?

**Rates (SM -> PMS)** is a push notification method where SiteMinder sends rate updates directly to your Property Management System (PMS). This integration ensures that pricing configured on the SiteMinder Platform are automatically synchronized to the PMS, maintaining accurate rate parity across all connected systems.

{% hint style="warning" %}
To implement **Rates (SM -> PMS)**, the PMS must certify for [Rates (PMS -> SM)](/pmsxchange-api/reference/rates/sm-to-pms).
{% endhint %}

#### **Considerations**

* **Asynchronous Processing**: Due to high update volumes, your PMS must receive updates and queue them for offline processing rather than processing in real-time. This prevents blocking further updates from the PMSX application.
* **Rate Configuration Options**: You must specify which rate format your PMS supports and implement the appropriate endpoint:
  * **Per Day Pricing**: `/rates` endpoint - Single daily rate with optional extra person charges
  * **Occupancy Based Pricing**: `/occupancy-based-rates` endpoint - Multiple rates based on adult occupancy (1-5 pax)
  * You only need to implement one rate endpoint based on your PMS capabilities
* **Automatic Rate Conversion**: SiteMinder handles conversion between per day and occupancy-based pricing using the room rate configuration data in the Platform, regardless of which format your PMS supports.
* **Message Volume**: Each message covers a specific room rate code combination with up to 760 dates per message, depending on the hotel's configured update period.
* **Code Mapping**: Use `invTypeCode` and `ratePlanCode` values that match the codes returned from the PMS Room and Rates endpoint.

{% hint style="warning" %}
**Authentication Requirements**: The REST components of the pmsXchange API only support PMS-level authentication, which means using the same credentials across all properties. If you’re currently using hotel-level authentication (credentials per property), we recommend switching to PMS-level to ensure compatibility with the REST endpoints.
{% endhint %}

## Message Exchange Flow

The following diagram illustrates the message flow for rate updates:

<figure><img src="/files/xruC5buqWwd7rdhIcwmh" alt=""><figcaption></figcaption></figure>

## Hotel Room Rate Update (Per day rate)

> Endpoint to receive and process hotel room rate rates

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"servers":[{"url":"https://pmsx-partner.com","description":"Partner server"}],"security":[{"basicAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"}},"parameters":{"traceToken":{"name":"X-SM-TRACE-TOKEN","in":"header","description":"The unique identifier of the request (UUID), this traceToken is logged with this request.","required":true,"schema":{"type":"string"}},"hotelCode":{"name":"hotelCode","in":"path","required":true,"description":"Hotel identifier code","schema":{"type":"string"}},"pmsCode":{"name":"pmsCode","in":"path","required":true,"description":"PMSX partner code","schema":{"type":"string"}}},"schemas":{"HotelRateUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","currencyCode","rates"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"rates":{"type":"array","description":"A list per day rate updates for the hotel","items":{"$ref":"#/components/schemas/RateUpdate"}}}},"RateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"rate":{"$ref":"#/components/schemas/OccupancyRateAmount"},"extraAdultAmount":{"$ref":"#/components/schemas/RateAmount"},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}},"SuccessResponse":{"type":"object","properties":{"result":{"type":"string","description":"Result"}}},"ErrorResponseList":{"type":"object","properties":{"errors":{"type":"array","description":"List errors","items":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}},"headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string","description":"The unique identifier of the request (UUID), this traceToken is logged with this request."}},"Time-Stamp":{"schema":{"type":"string","format":"date-time","description":"Response Timestamp."}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"AccessDenied":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"NotFound":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"TooManyRequests":{"description":"Too Many Requests","headers":{"Retry-After":{"description":"Number of seconds before SM should retry.","required":true,"schema":{"type":"integer","minimum":1}},"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServiceUnavailableError":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}}}},"paths":{"/pmses/{pmsCode}/hotels/{hotelCode}/rates/v1":{"post":{"parameters":[{"$ref":"#/components/parameters/traceToken"},{"$ref":"#/components/parameters/hotelCode"},{"$ref":"#/components/parameters/pmsCode"}],"summary":"Hotel Room Rate Update (Per day rate)","description":"Endpoint to receive and process hotel room rate rates","tags":["Hotel Rate Update"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelRateUpdate"}}}},"responses":{"200":{"description":"Rates Update received","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessResponse"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/AccessDenied"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}}}}
```

## Hotel Room Rate Update (Occupancy based rates)

> Endpoint to receive and process hotel room rate rates

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"servers":[{"url":"https://pmsx-partner.com","description":"Partner server"}],"security":[{"basicAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"}},"parameters":{"traceToken":{"name":"X-SM-TRACE-TOKEN","in":"header","description":"The unique identifier of the request (UUID), this traceToken is logged with this request.","required":true,"schema":{"type":"string"}},"hotelCode":{"name":"hotelCode","in":"path","required":true,"description":"Hotel identifier code","schema":{"type":"string"}},"pmsCode":{"name":"pmsCode","in":"path","required":true,"description":"PMSX partner code","schema":{"type":"string"}}},"schemas":{"HotelOccupancyBasedRateUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","currencyCode","occupancyBasedRates"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"occupancyBasedRates":{"type":"array","description":"A list of occupancy based rate updates for the hotel","items":{"$ref":"#/components/schemas/OccupancyBasedRateUpdate"}}}},"OccupancyBasedRateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"occupancyBasedRates":{"type":"array","description":"All occupancy based rates for this date (IE 1-5 pax)","items":{"$ref":"#/components/schemas/OccupancyRateAmount"}},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}},"ErrorResponseList":{"type":"object","properties":{"errors":{"type":"array","description":"List errors","items":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}},"headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string","description":"The unique identifier of the request (UUID), this traceToken is logged with this request."}},"Time-Stamp":{"schema":{"type":"string","format":"date-time","description":"Response Timestamp."}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"AccessDenied":{"description":"Access Denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"NotFound":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"TooManyRequests":{"description":"Too Many Requests","headers":{"Retry-After":{"description":"Number of seconds before SM should retry.","required":true,"schema":{"type":"integer","minimum":1}},"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"ServiceUnavailableError":{"description":"Service Unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseList"}}},"headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}}}},"paths":{"/pmses/{pmsCode}/hotels/{hotelCode}/occupancy-based-rates/v1":{"post":{"parameters":[{"$ref":"#/components/parameters/traceToken"},{"$ref":"#/components/parameters/hotelCode"},{"$ref":"#/components/parameters/pmsCode"}],"summary":"Hotel Room Rate Update (Occupancy based rates)","description":"Endpoint to receive and process hotel room rate rates","tags":["Hotel Rate Update"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelOccupancyBasedRateUpdate"}}}},"responses":{"200":{"description":"Rates Update received","headers":{"X-PMS-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"},"Time-Stamp":{"$ref":"#/components/headers/Time-Stamp"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/AccessDenied"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}}}}
```

## The HotelRateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"HotelRateUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","currencyCode","rates"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"rates":{"type":"array","description":"A list per day rate updates for the hotel","items":{"$ref":"#/components/schemas/RateUpdate"}}}},"RateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"rate":{"$ref":"#/components/schemas/OccupancyRateAmount"},"extraAdultAmount":{"$ref":"#/components/schemas/RateAmount"},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The RateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"rate":{"$ref":"#/components/schemas/OccupancyRateAmount"},"extraAdultAmount":{"$ref":"#/components/schemas/RateAmount"},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The HotelOccupancyBasedRateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"HotelOccupancyBasedRateUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","currencyCode","occupancyBasedRates"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"currencyCode":{"type":"string","description":"Three-letter currency code","pattern":"^[A-Z]{3}$"},"occupancyBasedRates":{"type":"array","description":"A list of occupancy based rate updates for the hotel","items":{"$ref":"#/components/schemas/OccupancyBasedRateUpdate"}}}},"OccupancyBasedRateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"occupancyBasedRates":{"type":"array","description":"All occupancy based rates for this date (IE 1-5 pax)","items":{"$ref":"#/components/schemas/OccupancyRateAmount"}},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The OccupancyBasedRateUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"OccupancyBasedRateUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"occupancyBasedRates":{"type":"array","description":"All occupancy based rates for this date (IE 1-5 pax)","items":{"$ref":"#/components/schemas/OccupancyRateAmount"}},"extraChildAmount":{"$ref":"#/components/schemas/RateAmount"}}},"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}},"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The OccupancyRateAmount object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"OccupancyRateAmount":{"type":"object","required":["amountAfterTax","numberOfAdults"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"},"numberOfAdults":{"type":"number","description":"Number of included adults the rate is for"}}}}}}
```

## The RateAmount object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RateAmount":{"type":"object","required":["amountAfterTax"],"properties":{"amountAfterTax":{"type":"number","description":"Rate amount after tax"},"amountBeforeTax":{"type":"number","description":"Currently unsupported, rate amount before tax"}}}}}}
```

## The HotelRestrictionsUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"HotelRestrictionsUpdate":{"type":"object","required":["invTypeCode","ratePlanCode","restrictions"],"properties":{"invTypeCode":{"type":"string","description":"Inventory type code"},"ratePlanCode":{"type":"string","description":"Rate plan code"},"restrictions":{"type":"array","description":"List of inventory and rate updates for the hotel","items":{"$ref":"#/components/schemas/RestrictionsUpdate"}}}},"RestrictionsUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"minLOS":{"type":"number","description":"Minimum length of stay"},"maxLOS":{"type":"number","description":"Maximum length of stay"},"forwardMinStay":{"type":"number","description":"Currently unsupported, minimum length of stay through"},"forwardMaxStay":{"type":"number","description":"Currently unsupported, maximum length of stay through"},"close":{"type":"boolean","description":"Room rate closed"},"closeToArrival":{"type":"boolean","description":"Room rate closed to arrival"},"closeToDeparture":{"type":"boolean","description":"Room rate closed to departure"}}}}}}
```

## The RestrictionsUpdate object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"RestrictionsUpdate":{"type":"object","required":["date"],"properties":{"date":{"type":"string","format":"date","description":"Date for which the update applies"},"minLOS":{"type":"number","description":"Minimum length of stay"},"maxLOS":{"type":"number","description":"Maximum length of stay"},"forwardMinStay":{"type":"number","description":"Currently unsupported, minimum length of stay through"},"forwardMaxStay":{"type":"number","description":"Currently unsupported, maximum length of stay through"},"close":{"type":"boolean","description":"Room rate closed"},"closeToArrival":{"type":"boolean","description":"Room rate closed to arrival"},"closeToDeparture":{"type":"boolean","description":"Room rate closed to departure"}}}}}}
```

## The ErrorResponse object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}}}}
```

## The ErrorResponseList object

```json
{"openapi":"3.0.0","info":{"title":"PMSX Ultra Sync APIs","version":"1.0.3"},"components":{"schemas":{"ErrorResponseList":{"type":"object","properties":{"errors":{"type":"array","description":"List errors","items":{"$ref":"#/components/schemas/ErrorResponse"}}}},"ErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Error code"},"message":{"type":"string","description":"Error message"}}}}}}
```

## Common Questions

<details>

<summary>Should I implement both rate endpoints or just one?</summary>

You only need to implement one rate endpoint based on your PMS capabilities:

* **Per Day Pricing** (`/rates`): Implement this if your PMS stores a single daily rate with optional extra person charges
* **Occupancy Based Pricing** (`/occupancy-based-rates`): Implement this if your PMS stores separate rates for different occupancy levels (1-5 adults)

SiteMinder automatically converts between formats using the room rate configuration in the Platform, so you'll receive data in the format your PMS supports regardless of how it's configured in the Platform.

</details>

<details>

<summary>Why must I queue updates for offline processing instead of processing them immediately?</summary>

Due to the high volume of rate updates, processing them synchronously would block SiteMinder from sending subsequent updates. Your PMS should:

1. Receive the update and return 200 OK immediately
2. Queue the update for asynchronous processing
3. Process the queued updates offline without blocking new incoming requests

This ensures continuous data flow and prevents update backlogs.

</details>

<details>

<summary>How many dates can be included in a single update message?</summary>

Each message can contain up to 760 dates for a specific room rate code combination. The actual number depends on the update period configured by the hotel. Each date in the array represents a separate day's rates.

</details>

<details>

<summary>How should I handle the <code>Retry-After</code> header in 429 responses?</summary>

When your PMS returns a `429` (Too Many Requests) response, include the `Retry-After` header with the number of seconds SiteMinder should wait before retrying. This allows you to implement rate limiting and back-pressure when your system is under high load.

Example: `Retry-After: 60` tells SiteMinder to wait 60 seconds before sending the next update.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Reservations


# Push (SM -> PMS)

Receive reservations from SiteMinder directly to your PMS in real-time.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Reservations · **Direction:** SM → PMS · **Method:** Push
{% endhint %}

## What is Reservations Push (SM -> PMS)?

**Reservation Push (SM -> PMS)** is a delivery method where SiteMinder actively sends reservations, modifications, and cancellations directly to the Property Management Systems (PMS)'s web service endpoint in real-time. This integration ensures that PMSs receive up-to-date booking information from various channels, maintaining consistency and reducing the risk of overbooking.

{% hint style="warning" %}
**Delivery Method Configuration**: The reservation delivery method (PUSH or PULL) is configured at the PMS level and applies to all properties using your integration. It is not possible to have some properties using Reservations PUSH while others use Reservations PULL. Once configured, all hotels connected to your PMS will receive reservations using the same method.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>PMS will provide a single global endpoint for all hotels for SiteMinder to push <code>OTA_HotelResNotifRQ</code> messages and receive <code>OTA_HotelResNotifRS</code> responses indicating success or failure.</li><li>The endpoint must use a registered domain name.</li><li>Direct IP addresses are not supported and cannot be used as endpoints.</li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>PMS will provide a single username/password for all hotels (PMS Level authentication).</li><li>SiteMinder will include authentication credentials within the <strong>SOAP Security header</strong> of each <code>OTA_HotelResNotifRQ</code>.</li><li>Credentials must follow a strong password policy: minimum of 12 characters, including a mix of uppercase and lowercase letters, numbers, and at least one special character (e.g., <code>!</code> <code>@</code> <code>#</code> <code>?</code> <code>]</code>).</li><li>Do not use <code>&#x3C;</code> <code>></code> <code>&#x26;</code> <code>"</code> <code>'</code> as they can cause issues with the Web Service.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses must be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li><li>SiteMinder sends requests over <strong>port 443</strong>.</li></ul></td></tr><tr><td><strong>IP Whitelisting</strong></td><td><p><strong>Pre-Production IP addresses:</strong><br></p><p><code>52.13.134.140</code></p><p><code>34.213.128.113</code></p><p><code>35.164.250.223</code><br><br><strong>Production IP addresses will be provided during go-live.</strong></p></td></tr></tbody></table>

## Message Exchange Flow

When SiteMinder receives bookings from channels, it delivers them to your PMS using a synchronous SOAP/HTTPS exchange. Each reservation triggers a separate request-response cycle.

1. **Reservation Message (SiteMinder to PMS):** `OTA_HotelResNotifRQ`\
   Delivers a single reservation message (new booking, modification, or cancellation).
2. **Confirmation Response (PMS to SiteMinder):** `OTA_HotelResNotifRS`\
   Confirms successful receipt or reports processing failure.

{% hint style="warning" %}
The PMS must send `OTA_HotelAvailNotifRQ` to SiteMinder with the **updated availability** after the reservations, modifications, and cancellations are processed on the PMS system. Refer to the [Availability and Restrictions](/pmsxchange-api/reference/availability).
{% endhint %}

## Security Header

The Security Header is a mandatory SOAP header that authenticates every reservation request from SiteMinder to your PMS endpoint. It contains the username and password credentials that you provide to SiteMinder during integration setup.

**Key Requirements:**

* **Validation**: Your endpoint must validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials should return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Reservation Message" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRQ
			xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" PrimaryLangID="en-us" ResStatus="Commit" Target="Production" TimeStamp="2024-07-06T15:27:41+00:00" Version="2.001">
			<HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book">
				<UniqueID Type="14" ID="ABC-1234567890"/>
				<UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/>
					<!-- ... other elements and attributes have been omitted for brevity ... -->
			</HotelReservation>
		</OTA_HotelResNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" Version="1" TimeStamp="2024-07-06T15:27:47+00:00">
			<Success/>
			<HotelReservations>
				<HotelReservation>
					<ResGlobalInfo>
						<HotelReservationIDs>
							<HotelReservationID ResID_Source="PMS" ResID_Type="40" ResID_Value="ABC-1234567890"/>
						</HotelReservationIDs>
					</ResGlobalInfo>
				</HotelReservation>
			</HotelReservations>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## 1. Reservation Message

### **OTA\_HotelResNotifRQ**

The `OTA_HotelResNotifRQ` message carries reservation data from SiteMinder to your PMS. Each message contains exactly one reservation (new booking, modification, or cancellation).

The message consists of a list of HotelReservation elements. The content may vary since SiteMinder delivers reservations from multiple upstream sources (booking channels), many of which have significantly different reservation formats and data structures.

**Key Concepts**

**HotelReservation**

* Represents a single booking from one channel
* Always contains exactly one reservation per message
* Includes all associated rooms, guests, and payments

**RoomStays**

* Container for all room bookings in the reservation
* Each room type booked creates a separate RoomStay
* Example: 2 Double Rooms + 1 Suite = 3 RoomStay elements

**Split Stays**

* When a guest changes room type during their stay
* Creates multiple RoomStays with different date ranges
* Example: Double Room (Jan 1-3) + Suite (Jan 3-5) = 2 RoomStays

**Guest Assignment**

* ResGuests can be linked to specific RoomStays via ResGuestRPH
* Some channels provide no guest details (ResGuests may be empty)
* Primary guest indicated by PrimaryIndicator="true"

**Pricing Levels**\
Pricing data is structured across multiple levels. Different OTAs provide different levels of pricing details. SiteMinder passes through what the OTA provides to a PMS system. Always read all levels not just RoomStay Total alone.&#x20;

* Daily rates can be found at `RoomRates.RoomRate.Rates.Rate/BaseRoomRates.RoomRate.Rates.Rate/Base` - room charge per night, excluding extras
* When `Rate/Total` exceeds `Rate/Base`, extra charge is included in the daily rate. Service details for this extra are not guaranteed. OTA may embed charges in the total without providing a corresponding `Services` element&#x20;
* The RoomStay Total at `RoomStays.RoomStay.Total` covers all daily rates and any room-stay-level extras
* The ReservationTotal at `ResGlobalInfo.Total` is the authoritative total for the entire reservation. It includes all room stays + any services or extras applied at the reservation level. Always use this as the final amount for the reservation.

```xml
<OTA_HotelResNotifRQ
	xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" PrimaryLangID="en-us" ResStatus="Commit" Target="Production" TimeStamp="2025-03-09T21:32:52+02:00" Version="2.001">
	<HotelReservations>
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservations>
</OTA_HotelResNotifRQ>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="133">Type</th><th width="51" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>OTA_HotelResNotifRQ</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@ResStatus</code></td><td>String</td><td align="center">1</td><td>Always <code>Commit</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@PrimaryLangID</code></td><td>String</td><td align="center">1</td><td>Always <code>en-us</code></td></tr><tr><td><code>@Target</code></td><td>String</td><td align="center">1</td><td>Always <code>Production</code></td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Current Version <code>2.001</code></td></tr></tbody></table>

### Hotel Reservation

```xml
<HotelReservations>
    <HotelReservation CreateDateTime="2025-05-12t00:45:23+00:00" ResStatus="Book">
        <POS>
            <Source>
                <RequestorID Type="22" ID="SITEMINDER"/>
                <BookingChannel Primary="True" Type="7">
                    <CompanyName Code="ABC">Booking Channel Name</CompanyName>
                </BookingChannel>
            </Source>
            <Source>
                <BookingChannel Primary="False" Type="7">
                    <CompanyName>Booking Channel Affilate</CompanyName>
                </BookingChannel>
            </Source>
        </POS>
        <UniqueID Type="14" ID="ABC-1234567890"/> <!-- SiteMinder Reservation ID -->
        <UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/>
	<!-- ... other elements and attributes have been omitted for brevity ... -->
    </HotelReservation>
</HotelReservations>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="133">Type</th><th width="51" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>HotelReservations</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the reservation details.</td></tr><tr><td><code>HotelReservation</code></td><td>Element</td><td align="center">1</td><td>Contains the specific reservation information.</td></tr><tr><td><code>@CreateDateTime</code></td><td>DateTime</td><td align="center">1</td><td>Date and time when the reservation was first made.<br><strong>Mandatory if <code>ResStatus</code> is <code>Book</code>.</strong><br><code>CreateDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>@ResStatus</code></td><td>String</td><td align="center">1</td><td><p>Status is:</p><p><code>Book</code></p><p><code>Modify</code></p><p><code>Cancel</code></p></td></tr><tr><td><code>@LastModifyDateTime</code></td><td>DateTime</td><td align="center">0..1</td><td>This indicates the last date and time when the reservation was last modified.<br><strong>Mandatory if ResStatus is <code>Modify</code> or <code>Cancel</code>.</strong><br><code>LastModifyDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">1..2</td><td><p>The reservation reference in SiteMinder.</p><p>The <em><strong>first</strong></em> UniqueID element will contain the unique identifier for the entire reservation. This identifier will identify the reservation through any subsequent modifications or cancellations.</p><p>The <em><strong>second</strong></em> UniqueID element with <code>ID_Context="MESSAGE_UNIQUE_ID"</code> is the unique id for this <em><strong>message</strong></em>. This identifier should be used to confirm the message once processed</p></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Value <code>14</code> is the unique ID for the reservation in SiteMinder.<br>Value <code>16</code> is the unique id for the message transferring the reservation.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Identifier of the reservation according to SiteMinder.</td></tr><tr><td><code>POS</code></td><td>Element</td><td align="center">1</td><td>Contains source details.</td></tr><tr><td><code>Source</code></td><td>Element</td><td align="center">1..2</td><td>Contains BookingChannel details.<br>A second POS / Source node can be present to define a secondary channel source.</td></tr><tr><td><code>RequestorID</code></td><td>Element</td><td align="center">1</td><td>Only present in the first <code>Source</code> element. Identifies the system sending the reservation.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Always <code>SITEMINDER</code></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Fixed at <code>22</code> (ESRP)</td></tr><tr><td><code>BookingChannel</code></td><td>Element</td><td align="center">1</td><td>Contains booking channel information.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>7</code> for 'Internet'.</td></tr><tr><td><code>@Primary</code></td><td>Boolean</td><td align="center">1</td><td>Indicates the primary booking source.</td></tr><tr><td><code>CompanyName</code></td><td>String</td><td align="center">1</td><td><p>Name of the Booking Channel.</p><p><strong>NOTE:</strong> This name is subject to change/variation by the Booking Channel. Use the <code>Code</code> attribute below to identify the booking channels.</p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Code of the booking channel.<br>See the <a href="/pages/MxQNXnNDdCYhYvgiZBu6">Booking Agent Codes Table</a> for reference.</td></tr></tbody></table>

### RoomStays

```xml
<RoomStays>
    <RoomStay MarketCode="Corporate" PromotionCode="STAYANDSAVE" SourceOfBusiness="Radio">
        <RoomTypes>
            <RoomType RoomType="Double Room" RoomTypeCode="DR" NonSmoking="true" Configuration="2 Beds and 1 cot">
                <!-- Additional RoomType elements -->
            </RoomType>
        </RoomTypes>
        <RatePlans>
                <!-- Additional RatePlan elements -->
            </RatePlan>
        </RatePlans>
        <RoomRates>
            <RoomRate RoomTypeCode="DR" RatePlanCode="RAC1" NumberOfUnits="1">
                <!-- Additional RoomRate elements -->
            </RoomRate>
        </RoomRates>
            <!-- Additional RoomStay elements -->
    </RoomStay>
</RoomStays>
```

<table><thead><tr><th width="252">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomStays</code></strong></td><td>Element</td><td align="center">1</td><td>Contains details of all room stays.</td></tr><tr><td><code>RoomStay</code></td><td>Element</td><td align="center">1..n</td><td>One instance of <code>RoomStay</code> per room type booked.</td></tr><tr><td><code>@PromotionCode</code></td><td>String</td><td align="center">0..1</td><td>If configured, this is the promotion code indicating, for instance, a specific marketing campaign (not the rate code).</td></tr><tr><td><code>@MarketCode</code></td><td>String</td><td align="center">0..1</td><td>A code to match a market segment for the booking.</td></tr><tr><td><code>@SourceOfBusiness</code></td><td>String</td><td align="center">0..1</td><td>Specifies where the business came from e.g. radio, newspaper ad, etc.</td></tr></tbody></table>

### RoomTypes

```xml
<RoomTypes>
    <RoomType RoomType="Double Room" RoomTypeCode="DR" NonSmoking="true" Configuration="2 Beds and 1 cot">
        <RoomDescription>
            <Text>Double room</Text>
        </RoomDescription>
        <AdditionalDetails>
            <AdditionalDetail Type="4" Code="PIA">
                <DetailDescription>
                    <Text>Room paid in advance with credit card</Text>
                </DetailDescription>
            </AdditionalDetail>
            <AdditionalDetail Type="5" Code="ECB">
                <DetailDescription>
                    <Text>Continental breakfast included</Text>
                </DetailDescription>
            </AdditionalDetail>
        </AdditionalDetails>
    </RoomType>
</RoomTypes>
```

<table><thead><tr><th width="255">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomTypes</code></strong></td><td>Element</td><td align="center">0..1</td><td>Provides more information about the room type for this room stay.</td></tr><tr><td><code>RoomType</code></td><td>Element</td><td align="center">0..1</td><td>Contains specific information about the room type.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the room booked.</td></tr><tr><td><code>@NonSmoking</code></td><td>Boolean</td><td align="center">0..1</td><td>Provided by the source channel.</td></tr><tr><td><code>@Configuration</code></td><td>String</td><td align="center">0..1</td><td>Information about the bedding configuration.</td></tr><tr><td><code>RoomDescription</code></td><td>Element</td><td align="center">0..1</td><td>Description of the room.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">0..1</td><td>Name of the room.</td></tr><tr><td><code>AdditionalDetails</code></td><td>Element</td><td align="center">0..1</td><td>Additional room information provided by the source channel.</td></tr><tr><td><code>AdditionalDetail</code></td><td>Element</td><td align="center">0..n</td><td></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><p>Refer to the <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/opentravel-codes-list#additional-detail-type-adt">Additional Detail Type (ADT)</a>.<br>Common usages are:</p><p><code>43</code> - Meal plan information<br><code>15</code> - Promotion information</p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Reference code provided by the source channel.</td></tr><tr><td><code>DetailDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Details provided by the source channel.</td></tr></tbody></table>

### RatePlans

```xml
<RatePlans>
    <RatePlan RatePlanCode="RAC1" EffectiveDate="2025-03-12" ExpireDate="2025-03-14" RatePlanName="RACK Rate1">
        <RatePlanDescription>
            <Text>Long Stay Discount</Text>
        </RatePlanDescription>
        <AdditionalDetails>
            <AdditionalDetail Type="15" Code="EB1">
                <DetailDescription>
                    <Text>Stay n Save promotion grants 10% discount</Text>
                </DetailDescription>
            </AdditionalDetail>
            <AdditionalDetail Type="43">
                <DetailDescription>
                    <Text>Continental breakfast included</Text>
                </DetailDescription>
            </AdditionalDetail>
        </AdditionalDetails>
    </RatePlan>
</RatePlans>
```

<table><thead><tr><th width="284">Element / @Attribute</th><th width="112">Type</th><th width="61" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RatePlans</code></strong></td><td>Element</td><td align="center">0..1</td><td>Provides more information about the rate plan for this room stay.</td></tr><tr><td><code>RatePlan</code></td><td>Element</td><td align="center">0..n</td><td>Contains details about the specific rate plan.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the rate booked.</td></tr><tr><td><code>@RatePlanName</code></td><td>String</td><td align="center">0..1</td><td>Name of the rate plan.</td></tr><tr><td><code>@EffectiveDate</code></td><td></td><td align="center">1</td><td>The effective date of the <code>RatePlan</code>.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">1</td><td>The expire date for a <code>RatePlan</code>, this should be considered an exclusive date, the date for which the current rate plan information is no longer valid.</td></tr><tr><td><code>RatePlanDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">0..1</td><td>Details provided about the rate plan.</td></tr><tr><td><code>AdditionalDetails</code></td><td>Element</td><td align="center">0..1</td><td>Additional rate plan information provided by the source channel.</td></tr><tr><td><code>AdditionalDetail</code></td><td>Element</td><td align="center">0..n</td><td></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><p>Refer to the <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/opentravel-codes-list#additional-detail-type-adt">Additional Detail Type (ADT)</a>.<br>Common usages are:</p><p><code>43</code> - Meal plan information<br><code>15</code> - Promotion information</p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Reference code provided by the source channel.</td></tr><tr><td><code>DetailDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Details provided by the source channel.</td></tr></tbody></table>

### RoomRates

{% tabs %}
{% tab title="Room Rates" %}

<pre class="language-xml"><code class="lang-xml"><strong>&#x3C;RoomRates>
</strong>    &#x3C;RoomRate RoomTypeCode="DR" RatePlanCode="RAC1" NumberOfUnits="1">
        &#x3C;Rates>
            &#x3C;Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2025-03-12" ExpireDate="2025-03-14">
                &#x3C;Base AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="USD">
                    &#x3C;Taxes Amount="10.00">
                        &#x3C;Tax Code="19" Percent="10" Amount="10.00">
                            &#x3C;TaxDescription>
                                &#x3C;Text>GST 10 percent&#x3C;/Text>
                            &#x3C;/TaxDescription>
                        &#x3C;/Tax>
                    &#x3C;/Taxes>
                &#x3C;/Base>
                &#x3C;Total AmountBeforeTax="102.50" AmountAfterTax="112.75" CurrencyCode="USD">
                    &#x3C;Taxes Amount="10.25">
                        &#x3C;Tax Code="19" Percent="10" Amount="10.25">
                            &#x3C;TaxDescription>
                                &#x3C;Text>GST 10 percent&#x3C;/Text>
                            &#x3C;/TaxDescription>
                        &#x3C;/Tax>
                    &#x3C;/Taxes>
                &#x3C;/Total>
            &#x3C;/Rate>
            &#x3C;!-- Additional Rate -->
        &#x3C;/Rates>
        &#x3C;ServiceRPHs>
            &#x3C;ServiceRPH RPH="1"/>
            &#x3C;!-- Additional ServiceRPH -->
        &#x3C;/ServiceRPHs>
    &#x3C;/RoomRate>
    &#x3C;!-- Additional RoomRate -->
&#x3C;/RoomRates>
</code></pre>

{% endtab %}

{% tab title="Same Rate per Night" %}

```xml
<RoomRates>
   <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
      <Rates>
         <Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2025-10-05" ExpireDate="2025-10-07">
	    <Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	    <Total AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	 </Rate>
      </Rates>
   </RoomRate>
</RoomRates>
<TimeSpan Start="2025-10-05" End="2025-10-07"/>
<Total AmountBeforeTax="306.00" AmountAfterTax="340.00" CurrencyCode="EUR">
```

{% endtab %}

{% tab title="Same Rate per Night + Extras" %}
This example shows daily rates when the same rate applies to both dates (2025-10-05 and 2025-10-06) and there are additional charges.

```xml
<RoomRates>
   <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
      <Rates>
         <Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2025-10-05" ExpireDate="2025-10-07">
	    <Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	    <Total AmountBeforeTax="170.00" AmountAfterTax="188.00" CurrencyCode="EUR"/>
	 </Rate>
      </Rates>
   </RoomRate>
</RoomRates>
<TimeSpan Start="2025-10-05" End="2025-10-07"/>
<Total AmountBeforeTax="340.00" AmountAfterTax="376.00" CurrencyCode="EUR">
```

{% endtab %}

{% tab title="Different Rate per Night" %}

```xml
<RoomRates>
   <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
      <Rates>
         <Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2025-10-05" ExpireDate="2025-10-06">
	    <Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	    <!-- ... other elements and attributes have been omitted for brevity ... -->
	 </Rate>
	 <Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2025-10-06" ExpireDate="2025-10-07">
            <Base AmountBeforeTax="180.00" AmountAfterTax="200.00" CurrencyCode="EUR"/>
	    <!-- ... other elements and attributes have been omitted for brevity ... -->
	 </Rate>
	 <Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2025-10-07" ExpireDate="2025-10-08">
            <Base AmountBeforeTax="225.00" AmountAfterTax="250.00" CurrencyCode="EUR"/>
	    <!-- ... other elements and attributes have been omitted for brevity ... -->
	 </Rate>
      </Rates>
   </RoomRate>
</RoomRates>
<TimeSpan Start="2025-10-05" End="2025-10-08"/>  
<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="128">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomRates</code></strong></td><td>Element</td><td align="center">1</td><td>A <code>RoomStay</code> can include multiple <code>RoomRate</code>, each containing several rates. This occurs when a single room is booked, but different rate plans apply across the duration of the stay.</td></tr><tr><td><code>RoomRate</code></td><td>Element</td><td align="center">1..n</td><td>One RoomRate per RoomStay. Multiple rates are listed under the RoomRate.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">1</td><td>Code of the room booked.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">1</td><td>Code of the rate plan booked.</td></tr><tr><td><code>@NumberOfUnits</code></td><td>Integer</td><td align="center">1</td><td>Always <code>1</code>. Each room will be listed in it's own RoomStay element.</td></tr><tr><td><code>Rates</code></td><td>Element</td><td align="center">0..1</td><td>Rate will contain a timespan for which a rate will apply for a room type. Multiple instances of Rate will be sent if rate changes apply.</td></tr><tr><td><code>Rate</code></td><td>Element</td><td align="center">1..n</td><td>Contains the daily rate information which matches the entire date range specified in the <code>RoomStay/TimeSpan</code> element.</td></tr><tr><td><code>@UnitMultiplier</code></td><td>Integer</td><td align="center">1</td><td>Equal to the number of days between <code>EffectiveDate</code> and <code>ExpireDate</code>. Multiply with the <code>UnitMultiplier</code> to get the total cost for the date span.</td></tr><tr><td><code>@RateTimeUnit</code></td><td>String</td><td align="center">1</td><td>Always <code>Day</code>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">1</td><td>Starting date of the rate. This date is inclusive.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">1</td><td>First day after the applicable period. This date is exclusive.</td></tr><tr><td><code>Base</code></td><td>Element</td><td align="center">0..1</td><td>Base/Gross <strong>per-day</strong> amount charged for the room.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The unit amount before tax.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The unit amount after tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>The unit tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax percentage.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the tax description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">0..1</td><td><p>Base Rate + any additional occupants and fees/extras.<br>If empty, assume the Base amount equals the Total amount.<br></p><p><strong>NOTE:</strong> It is possible that some OTAs do not provide any form of Rate information and as such a RoomRate / Rate / Total cannot be provided in such cases. Currently Hotelbeds (HBD) is a known channel that does not always provide Rate information.</p><p><strong>NOTE</strong>: Any extras that are to be included in the RoomRate total will be linked through the ServiceRPH node.</p></td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount before tax.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount after tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the total taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>The total tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@Percentage</code></td><td></td><td align="center">0..1</td><td>Tax percentage.</td></tr><tr><td><code>TaxDescription</code></td><td></td><td align="center">0..1</td><td>Text description of the tax.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td></td></tr><tr><td><code>ServiceRPHs</code></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ServiceRPH</code> elements.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">0..n</td><td>Links a service to the Service information at the <code>RoomRate</code> level.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1..n</td><td>Links a <code>Service</code> to the Service information provided at the HotelReservation level (if applicable) to this <code>RoomRate</code>.</td></tr></tbody></table>

### GuestCounts

```xml
<GuestCounts>
	<GuestCount AgeQualifyingCode="10" Count="2"/>
	<GuestCount AgeQualifyingCode="8" Count="1"/>
	<GuestCount AgeQualifyingCode="7" Count="1"/>
</GuestCounts>
```

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>GuestCounts</code></strong></td><td>Element</td><td align="center">1</td><td>Total guest counts for adult, child, and infant. Adult count must always be sent.</td></tr><tr><td><code>GuestCount</code></td><td>Element</td><td align="center">1..3</td><td><p>Represents the count for a specific age group.</p><p><br></p></td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">1</td><td><p><code>10</code> - Adult (mandatory)</p><p><code>8</code> - Child (optional)</p><p><code>7</code> - Infant (optional)</p></td></tr><tr><td><code>@Count</code></td><td>Integer</td><td align="center">1</td><td>Number of guests for this age group.</td></tr></tbody></table>

### TimeSpan

```xml
<TimeSpan Start="2025-10-05" End="2025-10-08"/>
```

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>TimeSpan</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the timespan for the <code>RoomStay</code>.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>Check-in date.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>Check-out date. Must be after Start.</td></tr></tbody></table>

### RoomStay Total

{% hint style="info" %}
This total covers the room stay only. It does not include services or extras applied at the reservation level. See [Reservation Total](https://developer.siteminder.com/pmsxchange-api/reference/reservations/push#reservationtotal) for the complete reservation amount.
{% endhint %}

```xml
<Total CurrencyCode="USD" AmountBeforeTax="500.00" AmountAfterTax="615.00">
    <Taxes Amount="115.00">
        <Tax Amount="50.00" Code="10">
            <TaxDescription>
                <Text>Occupancy Tax</Text>
            </TaxDescription>
        </Tax>
        <Tax Amount="65.00" Code="13">
            <TaxDescription>
                <Text>Sales Tax</Text>
            </TaxDescription>
        </Tax>
    </Taxes>
</Total>
```

<table><thead><tr><th width="251">Element / @Attribute</th><th width="134">Type</th><th width="61" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Total</code></strong></td><td>Element</td><td align="center">0..1</td><td>The total amount of the <code>RoomStay</code>.<br></td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount before tax.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount after tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>The total tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Amount of the tax/fee transferred.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax percentage.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the tax description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Text description of the tax</td></tr></tbody></table>

### BasicPropertyInfo

```xml
<BasicPropertyInfo HotelCode="HOTELCODE" HotelName="The Hotel Name"/>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>BasicPropertyInfo</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains basic identification details for the hotel associated with the reservation.<br><code>BasicPropertyInfo</code> will always be sent as either part of the <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">RoomStay</a> or <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGlobalInfo</a>, depending on your setup in SiteMinder. We recommend receiving the <code>BasicPropertyInfo</code> as part of the <code>ResGlobalInfo</code> due to how Booking.com cancellation messages are sent.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>@HotelName</code></td><td>String</td><td align="center">0..1</td><td>Name of the hotel.</td></tr></tbody></table>

### ServiceRPHs

```xml
<ServiceRPHs>
	<ServiceRPH RPH="1"/>
	<!-- Additional ServiceRPH elements -->
</ServiceRPHs>
```

<table><thead><tr><th width="256">Element / @Attribute</th><th width="112">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ServiceRPHs</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ServiceRPH</code> elements.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">1..n</td><td>Service at the <code>RoomStay</code> level.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links a <code>Service</code> to the Service information provided at the HotelReservation level (if applicable).</td></tr></tbody></table>

### ResGuestRPHs

```xml
<ResGuestRPHs>
	<ResGuestRPH RPH="1"/>
	<!-- Additional ResGuestRPH elements -->
</ResGuestRPHs>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGuestRPHs</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ResGuestRPH</code> elements.</td></tr><tr><td><code>ResGuestRPH</code></td><td>Element</td><td align="center">1..n</td><td>Container for the <code>RPH</code> attribute.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links the <code>RoomStay</code> to <code>ResGuest</code>. Find the links in <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGuests</a>.</td></tr></tbody></table>

### Comments

```xml
<Comments>
	<Comment>
		<Text>See the room stay comments here</Text>
	</Comment>
</Comments>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Comments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains comment for the <code>RoomStay</code>.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1..n</td><td>Holds the actual comment.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>The content of the comment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### Services

Extras and services in reservation XML can be identified through multiple attributes. Use this multi-layered approach to ensure reliable mapping:

**1. Use the ID attribute**: Map extras using the `@ID` attribute when present. This is the channel's unique identifier for the specific extra or service.

**2. Use ServiceInventoryCode**: If `@ID` is not provided, use the `@ServiceInventoryCode` attribute, which is always present. Reference the Service and Extra Charge table for commonly used codes, or request the complete code list from the hotelier for their specific connected channels.

**3. Keyword Detection**: Implement keyword detection logic that scans `<RateDescription><Text>` for common terms like "Parking," "Breakfast," "Spa," etc. This ensures that extras sent under different codes (`EXTRA`, `MEAL`, `OTHER`) by various channels are still correctly matched in your PMS, even when codes vary between booking sources.

```xml
<Services>
    <Service ServiceInventoryCode="EXTRA_BED" ID="12346" ServiceRPH="1" Inclusive="true" Quantity="1" ID_Context="CHANNEL" Type="18"><Service ServiceInventoryCode="EXTRA_BED" ID="12346" ServiceRPH="1" Inclusive="true" Quantity="1" ID_Context="CHANNEL" Type="18">
        <Price>
            <Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="EUR">
                <Taxes Amount="0.25">
                    <Tax Code="19" Percent="10" Amount="0.25">
                        <TaxDescription>
                            <Text>GST 10 percent</Text>
                        </TaxDescription>
                    </Tax>
                </Taxes>
            </Base>
            <Total AmountBeforeTax="5.00" AmountAfterTax="5.50" CurrencyCode="EUR">
                <Taxes Amount="0.50">
                    <Tax Code="19" Percent="10" Amount="0.50">
                        <TaxDescription>
                            <Text>GST 10 percent</Text>
                        </TaxDescription>
                    </Tax>
                </Taxes>
            </Total>
            <RateDescription>
                <Text>Extra person charge EUR 2.50 per day for cot</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-03-12" End="2025-03-14"/>
        </ServiceDetails>
    </Service>
    <!-- Additional Service elements -->
</Services>
```

<table><thead><tr><th width="262">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Services</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains service details provided to guests.</td></tr><tr><td><code>Service</code></td><td>Element</td><td align="center">1..n</td><td>Represents a non-room product provided to guests.</td></tr><tr><td><code>@ServiceInventoryCode</code></td><td>String</td><td align="center">1</td><td>Identifier code for the service. Refer to <a href="/pages/CiYdiVL1WUiiuWGcKNmx">Service and Extra Charge</a>. Channels/OTA's will use this list as a guide to code the extras/services or can use their own codes as well. Please request the property or the channel for the full list of extras/services and the codes configured in each channel.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Reference ID for the extra/service provided by the source booking channel.</td></tr><tr><td><code>@ServiceRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>Service</code> to a <code>RoomStay</code> or <code>RatePlan</code>. <code>ServiceRPH</code> absence indicates a HotelReservation-level charge.</td></tr><tr><td><code>@Inclusive</code></td><td>Boolean</td><td align="center">1</td><td>Must be set to <code>TRUE</code>, as SiteMinder reports totals as inclusive of charges and extras.</td></tr><tr><td><code>@Quantity</code></td><td>Integer</td><td align="center">1</td><td>Number of units included in the charge. This value does not affect the total amount.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">0..1</td><td>Always <code>CHANNEL</code></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>18</code></td></tr><tr><td><code>Price</code></td><td>Element</td><td align="center">1</td><td>Container for pricing details of the service.</td></tr><tr><td><code>Base</code></td><td>Element</td><td align="center">0..1</td><td>Base amount <strong>per unit</strong> charged for the service.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Total taxes amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a detailed description of the tax.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>Container for the total amount of the service.</td></tr><tr><td><code>@CurrencyCode</code></td><td></td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Total taxes amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a detailed description of the tax.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>RateDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a description of the rate applied to the service.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>A text description of the service/extra.</td></tr><tr><td><code>ServiceDetails</code></td><td>Element</td><td align="center">0..1</td><td>Container for additional service details.</td></tr><tr><td><code>TimeSpan</code></td><td>Element</td><td align="center">0..1</td><td>Contains the time span for which the service is provided.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">0..1</td><td>Start date of service.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">0..1</td><td>Last date of service.</td></tr></tbody></table>

### ResGuests

```xml
<ResGuests>
    <ResGuest ResGuestRPH="1" ArrivalTime="10:30:00" Age="8" PrimaryIndicator="true">
        <Profiles>
            <ProfileInfo>
                <UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/>
                <Profile ProfileType="1">
                    <Customer>
                        <PersonName>
                            <NamePrefix>Mr</NamePrefix>
                            <GivenName>James</GivenName>
                            <MiddleName>Herbert</MiddleName>
                            <Surname>Bond</Surname>
                        </PersonName>
                        <Telephone PhoneNumber="555-1234"/>
                        <Telephone PhoneNumber="555-4321" PhoneUseType="4"/>
                        <Telephone PhoneNumber="0411444000" PhoneTechType="5"/>
                        <Telephone PhoneNumber="213451515" PhoneTechType="3"/>
                        <Email>james.bond@mi5.co.uk</Email>
                        <Address>
                            <AddressLine>Claretta House</AddressLine>
                            <AddressLine>Tower Bridge Close</AddressLine>
                            <CityName>London</CityName>
                            <PostalCode>EC1 2PG</PostalCode>
                            <StateProv>Middlesex</StateProv>
                            <CountryName>United Kingdom</CountryName>
                        </Address>
                        <CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2017-03-31"/>
                    </Customer>
                </Profile>
            </ProfileInfo>
        </Profiles>
        <Comments>
            <Comment Name="ArrivalDetails">
                <Text>Arriving by coach</Text>
            </Comment>
            <Comment Name="DepartureDetails">
                <Text>Departure flight QF123</Text>
            </Comment>
        </Comments>
    </ResGuest>
    <!-- Additional ResGuest elements -->
</ResGuests>
```

<table><thead><tr><th width="260">Element / @Attribute</th><th width="112">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGuests</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the guests for the reservation.</td></tr><tr><td><code>ResGuest</code></td><td>Element</td><td align="center">1..n</td><td>Contains the specific guest details.</td></tr><tr><td><code>@ResGuestRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>ResGuest</code> to <code>RoomStay</code>. Find the links in <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGuestRPHs</a>.</td></tr><tr><td><code>@PrimaryIndicator</code></td><td>Boolean</td><td align="center">0..1</td><td><p>Indicates the primary guest on a reservation:<br><code>1</code> - primary guest</p><p><code>0</code> - secondary guests</p></td></tr><tr><td><code>@Age</code></td><td>Integer</td><td align="center">0..1</td><td>The age of the guest</td></tr><tr><td><code>@ArrivalTime</code></td><td>Time</td><td align="center">0..1</td><td>Arrival time of the guest.</td></tr><tr><td><code>Profiles</code></td><td>Element</td><td align="center">1</td><td>Contains the guest profile information.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td align="center">1</td><td>Contains the profile information for the guest.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">0..n</td><td>Contains profile ids provided by the source channel.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>16</code></td></tr><tr><td><code>@ID</code></td><td></td><td align="center">1</td><td>The reference identifier for the profile as provided by the source channel.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">1</td><td><code>CHANNEL</code> - To specify that this is a channel reference id/</td></tr><tr><td><code>Profile</code></td><td>Element</td><td align="center">1</td><td>Contains detailed customer profile information.</td></tr><tr><td><code>@ProfileType</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>1</code> (Customer).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td align="center">1</td><td>Contains detailed guest information.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">1</td><td>Contains the name information for the guest.</td></tr><tr><td><code>@NamePrefix</code></td><td>String</td><td align="center">0..1</td><td>Title of the guest:<br>Mr. Mrs. Ms. Miss Dr.</td></tr><tr><td><code>@GivenName</code></td><td>String</td><td align="center">1</td><td>First name of the guest.</td></tr><tr><td><code>@MiddleName</code></td><td>String</td><td align="center">0..1</td><td>Middle name of the guest.</td></tr><tr><td><code>@Surname</code></td><td>String</td><td align="center">1</td><td>Last name of the guest.</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..4</td><td>Contains telephone information related to the guest.</td></tr><tr><td><code>@PhoneNumber</code></td><td>String</td><td align="center">1</td><td>Contains the actual number (maximum 32 characters).</td></tr><tr><td><code>@PhoneUseType</code></td><td>Integer</td><td align="center">0..1</td><td>The type of phone use for example daytime, nighttime, work. If this field is blank this is the primary phone, otherwise PhoneUseType="4" denotes a secondary or nighttime phone</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td align="center">0..1</td><td><p>The type of phone technology. If not provided it should be assumed as a landline:</p><p><code>5</code> - Mobile<br><code>3</code> - Fax</p></td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..1</td><td>Contact email address.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..1</td><td>Address information of the guest.</td></tr><tr><td><code>@AddressLine</code></td><td>String</td><td align="center">0..n</td><td>Address lines for the guest.</td></tr><tr><td><code>@CityName</code></td><td>String</td><td align="center">0..1</td><td>City of residence.</td></tr><tr><td><code>@PostalCode</code></td><td>String</td><td align="center">0..1</td><td>Postal code.</td></tr><tr><td><code>@StateProv</code></td><td>String</td><td align="center">0..1</td><td>State or province name.</td></tr><tr><td><code>@CountryName</code></td><td>String</td><td align="center">0..1</td><td>Contains country information (maximum 64 characters). This is a free-text field, so a variety of formats may be received—for example: <em>Australia</em>, <em>AUS</em>, <em>AU</em>, etc.</td></tr><tr><td><code>CustLoyalty</code></td><td>Element</td><td align="center">0..1</td><td>Contains loyalty information for the customer.</td></tr><tr><td><code>@ProgramID</code></td><td>String</td><td align="center">0..1</td><td>The code or name of the membership program ('Hertz', 'AAdvantage', etc.).</td></tr><tr><td><code>@MembershipID</code></td><td>String</td><td align="center">0..1</td><td>Account identification number for this particular member in this particular program.</td></tr><tr><td><code>@ExpiryDate</code></td><td>Date</td><td align="center">0..1</td><td>Expiry date for this particular membership record in this particular program.</td></tr><tr><td><code>Document</code></td><td>Element</td><td align="center">0..1</td><td>Detailed document information for the guest.</td></tr><tr><td><code>@BirthCountry</code></td><td>String</td><td align="center">0..1</td><td>Birth country of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@BirthDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the date of birth as indicated in the document. Use <code>ISO 8601</code> date format.</td></tr><tr><td><code>@BirthPlace</code></td><td>String</td><td align="center">0..1</td><td>Specifies the birth place of the document holder (e.g., city, state, county, province).</td></tr><tr><td><code>@DocHolderNationality</code></td><td>String</td><td align="center">0..1</td><td>Country of nationality of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocID</code></td><td>String</td><td align="center">1</td><td>Unique number assigned by authorities to the document.</td></tr><tr><td><code>@DocIssueAuthority</code></td><td>String</td><td align="center">0..1</td><td>Indicates the group or association that granted the document.</td></tr><tr><td><code>@DocIssueCountry</code></td><td>String</td><td align="center">0..1</td><td>Country where the document was issued. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocIssueLocation</code></td><td>String</td><td align="center">0..1</td><td>Indicates the location where the document was issued.</td></tr><tr><td><code>@DocIssueStateProv</code></td><td>String</td><td align="center">0..1</td><td>State or Province where the document was issued.</td></tr><tr><td><code>@DocType</code></td><td>String</td><td align="center">1</td><td>Indicates the type of document. Refer to <a href="/pages/mZ5VhSA8q98aQtJqawjh">Document Type Code (DOC)</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the ending date.</td></tr><tr><td><code>@Gender</code></td><td>String</td><td align="center">0..1</td><td><p>Identifies the gender:</p><p><code>Female</code></p><p><code>Male</code></p><p><code>Unknown</code></p></td></tr><tr><td><code>DocumentHolderName</code></td><td>Element</td><td align="center">0..1</td><td>The name of the document holder in unformatted text (Mr. Sam Jones). If no <code>DocumentHolderName</code> is included, the guest name fields will be assumed as the holder name.</td></tr><tr><td><code>Comments</code></td><td>Element</td><td align="center">0..1</td><td>Container for extra information about the guest.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">0..2</td><td>Holds the actual comment.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">0..1</td><td><p>Identifier for the comment. Current supported names are:</p><p><code>ArrivalDetails</code><strong>:</strong> Details about the guest's mode of arrival.<br><code>DepartureDetails</code><strong>:</strong> Details about the guest's mode of departure.</p></td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>The content of the comment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### ResGlobalInfo

```xml
<ResGlobalInfo>
	<HotelReservationIDs>
		<HotelReservationID ResID_Type="14" ResID_Value="1234567890"/> <!-- OTA Reservation ID -->
		<HotelReservationID ResID_Type="26" ResID_Value="987654321"/> <!-- Itinerary ID -->
		<HotelReservationID ResID_Type="34" ResID_Value="74a63a92-d988-46b8-8476-3319285af8ac"/> <!-- Payment Context ID -->
	</HotelReservationIDs>
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGlobalInfo>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGlobalInfo</code></strong></td><td>Element</td><td align="center">1</td><td>Contains global information about the reservation.</td></tr><tr><td><code>HotelReservationIDs</code></td><td>Element</td><td align="center">0..1</td><td>Contains the <code>HotelReservationID</code>.</td></tr><tr><td><code>HotelReservationID</code></td><td>Element</td><td align="center">0..3</td><td>Reference number/string or PNR as supplied by the booking channel.<br>If this reservation is linked under an itinerary, the itinerary ID will be supplied as a second <code>HotelReservationID</code>.</td></tr><tr><td><code>@ResID_Type</code></td><td>String</td><td align="center">1</td><td><p>Will be one of the following values:</p><p><code>14</code> - OTA code for 'Travel Agent PNR'.</p><p><code>26</code> - OTA code for 'Associated itinerary reservation'.</p><p><code>34</code> - OTA code for “Master Reference”.</p></td></tr><tr><td><code>@ResID_Value</code></td><td>String</td><td align="center">1</td><td><p>For <code>@ResID_Type 14</code> this is the actual reference number/string supplied by the booking channel (maximum 64 characters).</p><p>For <code>@ResID_Type 26</code> will be the itinerary identifier for one or more bookings in an itinerary as provided by the source booking channel.</p><p><br>For <code>@ResID_Type 34</code> this is the reference number/string used as identifier for payment transaction. Refer to <a href="/pages/Zy5xk8cPknCwaamkKKyl">Payment Transaction Record</a>.</p><p><br><code>ResID_Value</code> could potentially contain special characters such as <code>/</code>.</p></td></tr></tbody></table>

### ResComments

```xml
<Comments>
	<Comment>
		<Text>See the reservation comments here</Text>
	</Comment>
	<!-- Additional Comment elements -->
</Comments>
```

<table><thead><tr><th width="234">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Comments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains comment for the reservation.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1..n</td><td>Holds the actual comment.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">1</td><td><p>Content of the comment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### ReservationTotal

{% hint style="info" %}
It includes all room stay totals plus any services or extras applied at the reservation level that are not reflected in individual room stay totals. Always use ResGlobalInfo.Total as the final reservation amount. Do not rely solely on RoomStay.Total.
{% endhint %}

```xml
<Total CurrencyCode="EUR" AmountBeforeTax="558.00" AmountAfterTax="620.00">
	<Taxes Amount="62.00">
		<Tax Code="35" Amount="62.00" Percent="10" CurrencyCode="EUR"/>
	</Taxes>
</Total>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Total</code></strong></td><td>Element</td><td align="center">0..1</td><td>Total amount for the reservation. This includes all <code>RoomStays</code> and any additional fees or charges that apply.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Total tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@Percent</code></td><td></td><td align="center">0..1</td><td>Tax percentage applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr></tbody></table>

### Memberships

```xml
<Memberships>
    <Membership ProgramCode="AAdvantage" AccountID="AA14567890"/>
</Memberships>
```

<table><thead><tr><th width="234">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Memberships</code></strong></td><td>Element</td><td align="center">0..1</td><td>A list of Memberships. Memberships provides a list of reward programs. This data is taken from <code>ResGuest / CustLoyalty</code>.</td></tr><tr><td><code>Membership</code></td><td>Element</td><td align="center">0..n</td><td></td></tr><tr><td><code>ProgramCode</code></td><td>String</td><td align="center">0..1</td><td>The code or name of the membership program ('Hertz', 'AAdvantage', etc.). Equivalent to <code>ProgramID</code>.</td></tr><tr><td><code>AccountID</code></td><td>String</td><td align="center">0..1</td><td>The account identification number for this particular member in this particular program. Equivalent to <code>MembershipID</code>.</td></tr></tbody></table>

### Fees

```xml
<Fees>
    <Fee TaxInclusive="true" Type="Inclusive" Code="27" Amount="5.00">
        <Taxes Amount="0.45"/>
        <Description Name="Commission">
            <Text>Commission - $5 flat fee</Text>
        </Description>
    </Fee>
</Fees>
```

<table><thead><tr><th width="234">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Fees</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for added fees/commission.</td></tr><tr><td><code>Fee</code></td><td>Element</td><td align="center">1..n</td><td>The actual fees/commission.</td></tr><tr><td><code>@TaxInclusive</code></td><td>String</td><td align="center">1</td><td><p>Content of the comment.</p><p>PCI sensitive data is prohibited.</p></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>Inclusive</code></td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">1</td><td>See <a href="https://siteminder.atlassian.net/wiki/pages/viewpage.action?pageId=1602940">OTA Fee Tax Type (FTT)</a> code table.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Commission amount.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Taxes amount.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Actual tax amount.</td></tr><tr><td><code>Description</code></td><td>Element</td><td align="center">0..1</td><td>Container of the comission <code>Text</code>.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">0..1</td><td><code>Commission</code> against the total of the reservation.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..1</td><td>A description of the fee.</td></tr></tbody></table>

### Guarantee

If the PMS is not PCI compliant, it will **not** receive credit card information directly. However, you can choose to work with a proxy service provider for [**credit card tokenization**](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations/credit-card-tokenization).

{% tabs %}
{% tab title="Credit Card" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted>
            <PaymentCard CardCode="VI" CardType="1" CardNumber="4444444444444444" ExpireDate="1114">
                <CardHolderName>John Smith</CardHolderName>
            </PaymentCard>
        </GuaranteeAccepted>
    </GuaranteesAccepted>
    <Comments>
        <Comment Name="PaymentReferenceId">
            <Text>123124151616</Text>
        </Comment>
    </Comments>
    <GuaranteeDescription>
        <Text>Payment accepted up front</Text>
    </GuaranteeDescription>
</Guarantee>
```

{% endtab %}

{% tab title="ThreeDomainSecurity" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted>
            <PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" ExpireDate="1234">
                <CardHolderName>John Smith</CardHolderName>
                <ThreeDomainSecurity>
                    <Results ThreeDSVersion="1.0.2" XID="z9UKb06xLziZMOXBEmWSVA1kwG0=" CAVV="MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=" ECI="05" />
                </ThreeDomainSecurity>
            </PaymentCard>
        </GuaranteeAccepted>
    </GuaranteesAccepted>
</Guarantee>
```

{% endtab %}

{% tab title="Payment Gateway" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted/>
    </GuaranteesAccepted>
    <Comments>
        <Comment Name="PaymentGatewayName">
            <Text>Paypal</Text>
        </Comment>
        <Comment Name="PaymentGatewayAuthCode">
            <Text>123143253467</Text>
        </Comment>
        <Comment Name="PaymentReferenceId">
            <Text>123124151616</Text>
        </Comment>
    </Comments>
    <GuaranteeDescription>
        <Text>Payment accepted up front</Text>
    </GuaranteeDescription>
</Guarantee>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="274">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Guarantee</code></strong></td><td>Element</td><td align="center">0..1</td><td>Guarantee provided with the reservation. Used if no deposit is paid for the reservation.</td></tr><tr><td><code>GuaranteesAccepted</code></td><td>Element</td><td align="center">1</td><td>Contains the details of accepted guarantees.</td></tr><tr><td><code>GuaranteeAccepted</code></td><td>Element</td><td align="center">1</td><td>Specific details of the accepted guarantee.</td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">1</td><td>Details of the payment card used for the guarantee.</td></tr><tr><td><code>@CardType</code></td><td>String</td><td align="center">0..1</td><td>Must be set to <code>1</code> (Credit Card) or <code>2</code> (Debit Card).</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">1</td><td>2-character code of the credit card issuer. Refer to <a href="/pages/Iqs1qAbBKAcBqhyyZHQt">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@CardNumber</code></td><td>String</td><td align="center">0..1</td><td>Actual credit card number.</td></tr><tr><td><code>@ExpireDate</code></td><td>String</td><td align="center">0..1</td><td>Expiry date of the credit card (format <code>MMyy</code>).</td></tr><tr><td><code>@MaskedCardNumber</code></td><td>String</td><td align="center">0..1</td><td>May be used to send a concealed or partial credit card number (e.g. "xxxxxxxxxxxx4444" or "4444").</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td align="center">0..1</td><td>Name of the cardholder.</td></tr><tr><td><code>ThreeDomainSecurity</code></td><td>Element</td><td align="center">0..1</td><td>Contains <code>3DS</code> (Three Domain Security) transaction details.</td></tr><tr><td><code>Results</code></td><td>Element</td><td align="center">1</td><td>Transaction results.<br><em><strong>IMPORTANT NOTE:</strong></em> <em><code>SCA / 3DS</code> details will only be provided if received from an <code>SCA / 3DS</code> compatible booking agent.</em></td></tr><tr><td><code>@ThreeDSVersion</code></td><td>String</td><td align="center">1</td><td><code>3DS</code> version used for authentication.</td></tr><tr><td><code>@XID</code></td><td>String</td><td align="center">0..1</td><td><p>Transaction identifier resulting from authentication processing.</p><p>When <code>ThreeDSVersion</code> = 1.x.x the transaction identifier MUST be provided in the <code>@XID</code> attribute.</p></td></tr><tr><td><code>@DSTransactionID</code></td><td>String</td><td align="center">0..1</td><td><p>Unique transaction identifier assigned by the Directory Server (DS) to identify a single transaction.</p><p>When <code>ThreeDSVersion</code> = 2.x.x the transaction identifier MUST be provided in the <code>@DSTransactionID</code> attribute.</p></td></tr><tr><td><code>@CAVV</code></td><td>String</td><td align="center">0..1</td><td>Cardholder Authentication Verification Value (CAVV); Authentication Verification Value (AVV); Universal Cardholder Authentication Field (UCAF)</td></tr><tr><td><code>@ECI</code></td><td>String</td><td align="center">1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#electronic-commerce-indicator">Electronic Commerce Indicator</a>.</td></tr><tr><td><code>@PAResStatus</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transactions-status-result-identifier">Transactions Status Result Identifier</a>.</td></tr><tr><td><code>@SignatureVerification</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transaction-signature-status">Transaction Signature Status</a>.</td></tr><tr><td><code>@Enrolled</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#status-of-authentication">Status of Authentication</a>.</td></tr><tr><td><code>Comments</code></td><td>Element</td><td align="center">0..1</td><td>The actual information related to the payment.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1..3</td><td>Holds the actual comment.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">1</td><td><p>Current supported names:</p><p><code>PaymentGatewayName</code>: The name of the payment gateway<br><code>PaymentGatewayAuthCode</code>: The authorization code of the payment gateway<br><code>PaymentReferenceId</code>: If a reference was provided for any payment</p></td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>Information related to the payment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr><tr><td><code>GuaranteeDescription</code></td><td>Element</td><td align="center">0..1</td><td>Information about the form of guarantee.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>Information related to the guarantee.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### DepositPayments

{% tabs %}
{% tab title="Deposit Only" %}

```xml
<DepositPayments>
    <GuaranteePayment>
        <AmountPercent Amount="30.00" CurrencyCode="USD" Percent="20.00"/>
        <Description>
            <Text>20% Deposit</Text>
        </Description>
    </GuaranteePayment>
</DepositPayments>			
```

{% endtab %}

{% tab title="Credit Card + Deposit" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted>
            <PaymentCard CardCode="VI" CardType="1" CardNumber="4444444444444444" ExpireDate="1114">
                <CardHolderName>Bruce Wayne</CardHolderName>
            </PaymentCard>
        </GuaranteeAccepted>
    </GuaranteesAccepted>
</Guarantee>
<DepositPayments>
    <GuaranteePayment>
        <AmountPercent Amount="30.00" CurrencyCode="USD" Percent="20.00"/>
        <Description>
            <Text>20% Deposit</Text>
        </Description>
    </GuaranteePayment>
</DepositPayments>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="270">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>DepositPayments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Deposit provided with the reservation.</td></tr><tr><td><code>GuaranteePayment</code></td><td>Element</td><td align="center">1</td><td>Contains details of the payment guarantee for the reservation.</td></tr><tr><td><code>AmountPercent</code></td><td>Element</td><td align="center">1</td><td>Represents the percentage of the total charge allocated for the deposit, rounded to two decimal places.<br>If <code>Total/AmountAfterTax</code> is provided, the percentage will be based on that value. Otherwise, if only <code>Total/AmountBeforeTax</code> is provided, the percentage will be calculated based on that value.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>A monetary amount taken for the deposit.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>The percentage used to calculate the amount.</td></tr><tr><td><code>@TaxInclusive</code></td><td></td><td align="center">0..1</td><td>Indicates if tax is included in <code>@Amount</code></td></tr><tr><td><code>Description</code></td><td>Element</td><td align="center">0..1</td><td>Contained of the deposit description <code>Text</code>.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description.</td></tr></tbody></table>

### Customer / Corporate / TravelAgent

{% tabs %}
{% tab title="Customer" %}
**Customer:** The individual who made the booking and serves as the primary contact for the reservation. This may or may not be the same person as the guest staying in the room.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
    <ProfileInfo>
        <UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/>
        <Profile ProfileType="1" ShareAllMarketInd="true">
            <Customer>
                <Document DocID="P123456" DocType="18" Gender="unknown" BirthDate="1920-02-29" BirthCountry="US" BirthPlace="Sydney" DocHolderNationality="AU" DocIssueAuthority="ImmigionNNNNNNNN" DocIssueCountry="AU" DocIssueLocation="Sydney" DocIssueStateProvince="QLD" EffectiveDate="2020-01-01" ExpireDate="2025-01-01">
                    <DocumentHolderName>James Herbert</DocumentHolderName>
                </Document>
                <PersonName>
                    <NamePrefix>Mr</NamePrefix>
                    <GivenName>James</GivenName>
                    <MiddleName>Herbert</MiddleName>
                    <Surname>Bond</Surname>
                </PersonName>
                <Telephone PhoneNumber="555-1234"/>
                <Telephone PhoneNumber="555-4321" PhoneUseType="4"/>
                <Telephone PhoneNumber="0411444000" PhoneTechType="5"/>
                <Telephone PhoneNumber="213451515" PhoneTechType="3"/>
                <Email>james.bond@mi5.co.uk</Email>
                <Address>
                    <AddressLine>Claretta House</AddressLine>
                    <AddressLine>Tower Bridge Close</AddressLine>
                    <CityName>London</CityName>
                    <PostalCode>EC1 2PG</PostalCode>
                    <StateProv>Middlesex</StateProv>
                    <CountryName>United Kingdom</CountryName>
                    <CompanyName>MI6</CompanyName>
                </Address>
                <CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2017-03-31"/>
            </Customer>
        </Profile>
    </ProfileInfo>
    <!-- Additional ProfileInfo elements -->
</Profiles>    
```

{% endcode %}
{% endtab %}

{% tab title="Corporate" %}
**Corporate:** The company or organisation associated with the booking, typically where a negotiated corporate rate applies or the reservation is billed to a company account.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
    <ProfileInfo>
        <Profile ProfileType="1">
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </Profile>
    </ProfileInfo>
    <!-- Additional ProfileInfo element -->                    
    <ProfileInfo>
        <UniqueID Type="16" ID="4444" ID_Context="IATA"/>
        <Profile ProfileType="3">
            <Customer>
                <PersonName>
                    <NamePrefix>Joe</NamePrefix>
                    <Surname>Smith</Surname>
                </PersonName>
                <Telephone PhoneNumber="555-1234"/>
                <Address>
                <CompanyName>American Express</CompanyName>
                </Address>
        </Customer>
    </Profile>
</ProfileInfo>
</Profiles>
```

{% endcode %}
{% endtab %}

{% tab title="Travel Agent" %}
**Travel Agent:** The agency or intermediary that sourced the booking on behalf of the customer, typically identified by an IATA or ARC number for commission reconciliation purposes.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
    <ProfileInfo>
        <Profile ProfileType="1">
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </Profile>
    </ProfileInfo>
    <!-- Additional ProfileInfo element -->                    
    <ProfileInfo>
        <UniqueID Type="16" ID="STA" ID_Context="CHANNEL"/>
        <UniqueID Type="16" ID="12312414" ID_Context="IATA"/>
        <Profile ProfileType="4">
            <Customer>
                <PersonName>
                    <NamePrefix>Mis</NamePrefix>
                    <Surname>Moneypenny</Surname>
                </PersonName>
                <Telephone PhoneNumber="555-1234"/>
                <Address>
                <CompanyName>STA Travel</CompanyName>
                </Address>
        </Customer>
    </Profile>
</ProfileInfo>
</Profiles>
```

{% endcode %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="260">Element / @Attribute</th><th width="112">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Profiles</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the profile information.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td align="center">1..3</td><td>Contains the profiles.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">0..n</td><td>Contains profile ids provided by the source channel. Available for <code>ProfileType 3</code> (Corporate) and <code>ProfileType 4</code> (Travel Agent)</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>16</code></td></tr><tr><td><code>@ID</code></td><td></td><td align="center">1</td><td>The reference identifier for the profile as provided by the source channel</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">1</td><td><code>CHANNEL</code> To specify that this is a channel reference id<br><code>IATA</code> To specify that this is an IATA identifier for a travel agent</td></tr><tr><td><code>Profile</code></td><td>Element</td><td align="center">1</td><td>Contains detailed customer profile information.</td></tr><tr><td><code>@ProfileType</code></td><td>Integer</td><td align="center">1</td><td><p>Defines the type of profile:</p><p><code>1</code> - Customer <strong>(mandatory)</strong><br><code>2</code> - GDS (optional)</p><p><code>3</code> - Corporate (optional)</p><p><code>4</code> - Travel Agent (optional)<br><code>5</code> - Wholesaler (optional)<br><code>21</code> - Arranger (optional)</p></td></tr><tr><td><code>@ShareAllMarketInd</code></td><td>Boolean</td><td align="center">0..1</td><td>Customer has 'opted in' to receive marking information (EU Customers).</td></tr><tr><td><code>@ShareAllOptOutInd</code></td><td>Boolean</td><td align="center">0..1</td><td>Customer has 'opted out' of receiving marking information (Non EU).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td align="center">1</td><td>Contains detailed guest information.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">1</td><td>Contains the name information for the guest.</td></tr><tr><td><code>NamePrefix</code></td><td>Element</td><td align="center">0..1</td><td>Title of the guest.</td></tr><tr><td><code>GivenName</code></td><td>Element</td><td align="center">1</td><td>First name of the guest.</td></tr><tr><td><code>MiddleName</code></td><td>Element</td><td align="center">0..1</td><td>Middle name of the guest.</td></tr><tr><td><code>Surname</code></td><td>Element</td><td align="center">1</td><td>Last name of the guest.</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..4</td><td>Contains telephone information related to the guest.</td></tr><tr><td><code>@PhoneNumber</code></td><td>String</td><td align="center">1</td><td>Contains the actual number (maximum 32 characters).</td></tr><tr><td><code>@PhoneUseType</code></td><td>Integer</td><td align="center">0..1</td><td>The type of phone use for example daytime, nighttime, work. If this field is blank this is the primary phone, otherwise PhoneUseType="4" denotes a secondary or nighttime phone.</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td align="center">0..1</td><td><p>The type of phone technology. If not provided it should be assumed as a landline</p><p><code>5</code> - Mobile<br><code>3</code> - Fax</p></td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..1</td><td>Contact email address.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..1</td><td>Address information of the guest.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td align="center">0..n</td><td>Address lines for the guest.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td align="center">0..1</td><td>City of residence.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td align="center">0..1</td><td>Postal code.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td align="center">0..1</td><td>State or province name.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td align="center">0..1</td><td>Contains country information (maximum 64 characters). This is a free-text field, so a variety of formats may be received—for example: <em>Australia</em>, <em>AUS</em>, <em>AU</em>, etc.</td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">1</td><td>Name of the company. Used for <code>ProfileType 3</code> (Corporate) and <code>ProfileType 4</code> (Travel Agent) only. While can be received in <code>ProfileType 1</code> , it is not standard practice.</td></tr><tr><td><code>CustLoyalty</code></td><td>Element</td><td align="center">0..1</td><td>Contains loyalty information for the customer.</td></tr><tr><td><code>@ProgramID</code></td><td>String</td><td align="center">0..1</td><td>Defined membership program name or ID applicable to the program.</td></tr><tr><td><code>@MembershipID</code></td><td>String</td><td align="center">0..1</td><td>Account identification number for this particular member in this particular program.</td></tr><tr><td><code>@ExpiryDate</code></td><td>Date</td><td align="center">0..1</td><td>Expiry date for this particular membership record in this particular program.</td></tr><tr><td><code>Document</code></td><td>Element</td><td align="center">0..1</td><td>Detailed document information for the guest.</td></tr><tr><td><code>@BirthCountry</code></td><td>String</td><td align="center">0..1</td><td>Birth country of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@BirthDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the date of birth as indicated in the document. Use <code>ISO 8601</code> date format.</td></tr><tr><td><code>@BirthPlace</code></td><td>String</td><td align="center">0..1</td><td>Specifies the birth place of the document holder (e.g., city, state, county, province).</td></tr><tr><td><code>@DocHolderNationality</code></td><td>String</td><td align="center">0..1</td><td>Country of nationality of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocID</code></td><td>String</td><td align="center">1</td><td>Unique number assigned by authorities to the document.</td></tr><tr><td><code>@DocIssueAuthority</code></td><td>String</td><td align="center">0..1</td><td>Indicates the group or association that granted the document.</td></tr><tr><td><code>@DocIssueCountry</code></td><td>String</td><td align="center">0..1</td><td>Country where the document was issued. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocIssueLocation</code></td><td>String</td><td align="center">0..1</td><td>Indicates the location where the document was issued.</td></tr><tr><td><code>@DocIssueStateProv</code></td><td>String</td><td align="center">0..1</td><td>State or Province where the document was issued.</td></tr><tr><td><code>@DocType</code></td><td>String</td><td align="center">1</td><td>Indicates the type of document. Refer to <a href="/pages/mZ5VhSA8q98aQtJqawjh">Document Type Code (DOC)</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the ending date.</td></tr><tr><td><code>@Gender</code></td><td>String</td><td align="center">0..1</td><td><p>Identifies the gender:</p><p><code>Female</code></p><p><code>Male</code></p><p><code>Unknown</code></p></td></tr><tr><td><code>DocumentHolderName</code></td><td>Element</td><td align="center">0..1</td><td>The name of the document holder in unformatted text (Mr. Sam Jones). If no <code>DocumentHolderName</code> is included, the guest name fields will be assumed as the holder name.</td></tr></tbody></table>

### BasicPropertyInfo

```xml
<BasicPropertyInfo HotelCode="HOTELCODE" HotelName="The Hotel Name"/>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>BasicPropertyInfo</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains basic identification details for the hotel associated with the reservation.<br><code>BasicPropertyInfo</code> will always be sent as either part of the <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">RoomStay</a> or <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGlobalInfo</a>, depending on your setup in SiteMinder. We recommend receiving the <code>BasicPropertyInfo</code> as part of the <code>ResGlobalInfo</code> due to how Booking.com cancellation messages are sent.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>@HotelName</code></td><td>String</td><td align="center">0..1</td><td>Name of the hotel.</td></tr></tbody></table>

***

## 2. Confirmation Response

The `OTA_HotelResNotifRS` message is sent from the PMS in response to the `OTA_HotelResNotifRQ` request. It confirms whether the reservation was successfully received and stored by the PMS, or reports any errors that prevented processing.

This response is critical for SiteMinder's delivery confirmation. Based on your response, SiteMinder will either mark the reservation as delivered (success) or continue retry attempts (failure or timeout).

**Timing Requirements**

* The response **must be returned within 60 seconds** of receiving the request.
* Responses taking longer than 60 seconds are treated as failures and trigger retries.
* The response must be valid SOAP/XML - HTML error pages or plain text will be treated as failures

If no valid response is received, **SiteMinder will retry** the request according to this schedule:

* **First 10 attempts**: Once every minute.
* **From the 11th attempt onward**: Retries occur every 5 minutes.
* **Retry duration**: This continues until a successful response is received or the request **times out**.

**Response Behaviour Impact**

Your response type determines SiteMinder's behaviour. Only return an error response for permanent failures (e.g. invalid credentials, HotelCode not found). For temporary issues (e.g. service unavailable, bad gateway, service under maintenance), let the request timeout to allow retry.

<table data-header-hidden><thead><tr><th width="267.66015625"></th><th></th></tr></thead><tbody><tr><td><strong>Success Response (<code>&#x3C;Success/></code>)</strong></td><td><ul><li>Delivery confirmed, no retries.</li><li>Reservation marked as successfully delivered.</li></ul></td></tr><tr><td><strong>Error Response (<code>&#x3C;Errors></code>)</strong></td><td><ul><li>Delivery confirmed but reservation rejected</li><li>No retries - this is a final decision</li><li>Reservation marked as failed</li><li>Property receives error notification</li><li>Manual intervention required to reprocess</li></ul></td></tr><tr><td><strong>No/Invalid Response (timeout, HTTP error, invalid XML)</strong></td><td><ul><li>Triggers automatic retry mechanism.</li><li>Follows retry schedule (1 min × 10, then 5 min intervals).</li><li>Reservation remains in pending until successful or time out.</li></ul></td></tr></tbody></table>

{% tabs %}
{% tab title="Success Response" %}

* The presence of the `<Success/>` element indicates that the reservation was created in the PMS.
* The `HotelReservationID` holds the ID of the newly created reservation in the PMS.

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" Version="1.0" TimeStamp="2024-07-06T15:27:47+00:00">
			<Success/>
			<HotelReservations>
				<HotelReservation>
					<ResGlobalInfo>
						<HotelReservationIDs>
							<HotelReservationID ResID_Source="PMS" ResID_Type="40" ResID_Value="ABC-1234567890"/>
						</HotelReservationIDs>
					</ResGlobalInfo>
				</HotelReservation>
			</HotelReservations>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Error Response" %}

* The presence of the `<Error/>` element indicates that the reservation was **not created** in the PMS.
* **No** **`HotelReservationID`** is present if the PMS was unable to save the reservation.

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" Version="1.0" TimeStamp="2024-07-06T15:27:47+00:00">
			<Errors>
				<Error ShortText="Property not found with HotelCode: ABC"/>
			</Errors>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>OTA_HotelResNotifRS</code></strong></td><td>Element</td><td align="center">1</td><td>Root element.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version.<br>Must be set to <code>1.0</code></td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Either <code>Success</code> or <code>Error</code> element present.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Contains a list of errors.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1</td><td>Should be at least one node if there is an <code>Errors</code> node.</td></tr><tr><td><code>@ShortText</code></td><td>String</td><td align="center">1</td><td>An abbreviated, human-readable version of the error message that still provides enough context to understand the issue.</td></tr><tr><td><code>HotelReservations</code></td><td>Element</td><td align="center">1</td><td>Root Element.<br>Mandatory if <code>Success</code> is sent.</td></tr><tr><td><code>HotelReservation</code></td><td>Element</td><td align="center">1</td><td>Contains the specific reservation information.</td></tr><tr><td><code>ResGlobalInfo</code></td><td>Element</td><td align="center">1</td><td><strong>Mandatory</strong> if the reservation is part of a successful delivery batch.</td></tr><tr><td><code>HotelReservationIDs</code></td><td>Element</td><td align="center">1</td><td>Contains PMS reservation identifier.</td></tr><tr><td><code>HotelReservationID</code></td><td>Element</td><td align="center">1</td><td>PMS reservation identifier.</td></tr><tr><td><code>@ResID_Source</code></td><td>String</td><td align="center">1</td><td>Always <code>PMS</code></td></tr><tr><td><code>@ResID_Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>40</code></td></tr><tr><td><code>@ResID_Value</code></td><td>String</td><td align="center">1</td><td>The identifier of the reservation created by the PMS. This is the reservation ID in the PMS.</td></tr></tbody></table>

## Reservation XML Samples

<details>

<summary>Maximum Content XML</summary>

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:UsernameToken><wsse:Username>USERNAME</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body><OTA_HotelResNotifRQ xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" PrimaryLangID="en-us" ResStatus="Commit" Target="Production" TimeStamp="2024-07-06T15:27:41+00:00" Version="2.001"><HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book"><POS><Source><RequestorID Type="22" ID="SITEMINDER"/><BookingChannel Primary="true" Type="7"><CompanyName Code="EXP">Expedia</CompanyName></BookingChannel></Source><Source><BookingChannel Primary="false" Type="7"><CompanyName Code="EXPA">Expedia Affilate Account</CompanyName></BookingChannel></Source></POS><UniqueID Type="14" ID="ABC-1234567890"/><UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/><RoomStays><RoomStay MarketCode="Corporate" PromotionCode="STAYANDSAVE" SourceOfBusiness="Radio"><RoomTypes><RoomType RoomType="Double Room" RoomTypeCode="DR" NonSmoking="true" Configuration="2 Beds and 1 cot"><RoomDescription><Text>Double room</Text></RoomDescription><AdditionalDetails><AdditionalDetail Type="4" Code="PIA"><DetailDescription><Text>Room paid in advance with credit card</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="7"><DetailDescription><Text>Cancellation deadline 10/03/26</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="5" Code="ECB"><DetailDescription><Text>Continental breakfast included</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RoomType></RoomTypes><RatePlans><RatePlan RatePlanCode="RAC1" EffectiveDate="2026-03-12" ExpireDate="2026-03-14" RatePlanName="RACK Rate1"><RatePlanDescription><Text>Long Stay Discount</Text></RatePlanDescription><AdditionalDetails><AdditionalDetail Type="15" Code="EB1"><DetailDescription><Text>Stay n Save promotion grants 10% discount</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="43"><DetailDescription><Text>Continental breakfast included</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="5" Code="ECB"><DetailDescription><Text>Expedia Collect</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RatePlan><RatePlan RatePlanCode="RAC2" EffectiveDate="2026-03-14" ExpireDate="2026-03-15" RatePlanName="RACK Rate2"><RatePlanDescription><Text>Discounted Daily Rate</Text></RatePlanDescription><AdditionalDetails><AdditionalDetail Type="15" Code="EB1"><DetailDescription><Text>Single Night Discount Promo</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="43"><DetailDescription><Text>Continental breakfast included</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="5" Code="ECB"><DetailDescription><Text>Expedia Collect</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RatePlan></RatePlans><RoomRates><RoomRate RoomTypeCode="DR" RatePlanCode="RAC1" NumberOfUnits="1"><Rates><Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2026-03-12" ExpireDate="2026-03-14"><Base AmountBeforeTax="200.00" AmountAfterTax="220.00" CurrencyCode="USD"><Taxes Amount="20.00"><Tax Code="19" Percent="10" Amount="20.00"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="202.50" AmountAfterTax="222.75" CurrencyCode="USD"><Taxes Amount="20.25"><Tax Code="19" Percent="10" Amount="20.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total></Rate></Rates><ServiceRPHs><ServiceRPH RPH="1"/></ServiceRPHs></RoomRate><RoomRate RoomTypeCode="DR" RatePlanCode="RAC2" NumberOfUnits="1"><Rates><Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2026-03-14" ExpireDate="2026-03-15"><Base AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="USD"><Taxes Amount="10.00"><Tax Code="19" Percent="10" Amount="10.00"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="102.50" AmountAfterTax="112.75" CurrencyCode="USD"><Taxes Amount="10.25"><Tax Code="19" Percent="10" Amount="10.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total></Rate></Rates><ServiceRPHs><ServiceRPH RPH="2"/></ServiceRPHs></RoomRate></RoomRates><ServiceRPHs><ServiceRPH RPH="3"/></ServiceRPHs><GuestCounts><GuestCount AgeQualifyingCode="10" Count="1"/><GuestCount AgeQualifyingCode="8" Count="1"/><GuestCount AgeQualifyingCode="7" Count="1"/></GuestCounts><TimeSpan Start="2026-03-12" End="2026-03-15"/><Total AmountAfterTax="568.25" CurrencyCode="USD"/><BasicPropertyInfo HotelCode="10107"/><ResGuestRPHs><ResGuestRPH RPH="1"/></ResGuestRPHs><Comments><Comment><Text>non-smoking Room requested, king bed</Text></Comment></Comments></RoomStay></RoomStays><Services><Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="1" Quantity="1" ID="12345" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="USD"><Taxes Amount="0.25"><Tax Code="19" Percent="10" Amount="0.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="5.00" AmountAfterTax="5.50" CurrencyCode="USD"><Taxes Amount="0.50"><Tax Code="19" Percent="10" Amount="0.50"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Extra person charge $2.50 (ex GST) per day for cot</Text></RateDescription></Price><ServiceDetails><TimeSpan End="2026-03-14" Start="2026-03-12"/></ServiceDetails></Service><Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="2" Quantity="1" ID="12346" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="USD"><Taxes Amount="0.25"><Tax Code="19" Percent="10" Amount="0.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="USD"><Taxes Amount="0.25"><Tax Code="19" Percent="10" Amount="0.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Extra person charge $2.50 (ex GST) per day for cot</Text></RateDescription></Price><ServiceDetails><TimeSpan End="2026-03-15" Start="2026-03-14"/></ServiceDetails></Service><Service ServiceInventoryCode="OTHER" Inclusive="true" ServiceRPH="3" Quantity="2" ID="12347" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="4.55" AmountAfterTax="5.00" CurrencyCode="USD"><Taxes Amount="0.45"><Tax Code="19" Percent="10" Amount="0.45"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="9.09" AmountAfterTax="10.00" CurrencyCode="USD"><Taxes Amount="0.91"><Tax Code="19" Percent="10" Amount="0.91"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Extra bathrobe $5.00 (incl GST) per person</Text></RateDescription></Price></Service><Service ServiceInventoryCode="EXTRA" Inclusive="true" Quantity="1" ID="12348" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="4.55" AmountAfterTax="5.00" CurrencyCode="USD"><Taxes Amount="0.45"><Tax Code="19" Percent="10" Amount="0.45"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="13.65" AmountAfterTax="15.00" CurrencyCode="USD"><Taxes Amount="1.35"><Tax Code="19" Percent="10" Amount="1.35"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Car Park - Undercover Parking (Clearance 2.2 meter or 7.2 feet) $5.00 (incl GST) per day</Text></RateDescription></Price><ServiceDetails><TimeSpan End="2026-03-15" Start="2026-03-12"/></ServiceDetails></Service></Services><ResGuests><ResGuest ResGuestRPH="1" ArrivalTime="10:30:00" Age="8" PrimaryIndicator="true"><Profiles><ProfileInfo><UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/><Profile ProfileType="1"><Customer><PersonName><NamePrefix>Mr</NamePrefix><GivenName>James</GivenName><MiddleName>Herbert</MiddleName><Surname>Bond</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Telephone PhoneNumber="555-4321" PhoneUseType="4"/><Telephone PhoneNumber="0411444000" PhoneTechType="5"/><Telephone PhoneNumber="213451515" PhoneTechType="3"/><Email>james.bond@mi5.co.uk</Email><Address><AddressLine>Claretta House</AddressLine><AddressLine>Tower Bridge Close</AddressLine><CityName>London</CityName><PostalCode>EC1 2PG</PostalCode><StateProv>Middlesex</StateProv><CountryName>United Kingdom</CountryName></Address><CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2027-03-31"/></Customer></Profile></ProfileInfo></Profiles><Comments><Comment Name="ArrivalDetails"><Text>Arriving by coach</Text></Comment><Comment Name="DepartureDetails"><Text>Departure flight QF123</Text></Comment></Comments></ResGuest></ResGuests><ResGlobalInfo><Guarantee><GuaranteesAccepted><GuaranteeAccepted><PaymentCard CardCode="VI" CardType="1" CardNumber="4444444444444444" ExpireDate="1114"><CardHolderName>John Smith</CardHolderName></PaymentCard></GuaranteeAccepted></GuaranteesAccepted><Comments><Comment Name="PaymentReferenceId"><Text>123124151616</Text></Comment></Comments><GuaranteeDescription><Text>Payment accepted up front</Text></GuaranteeDescription></Guarantee><DepositPayments><GuaranteePayment><AmountPercent Amount="291.63" Percent="50" CurrencyCode="USD"/><Description><Text>50% Deposit</Text></Description></GuaranteePayment></DepositPayments><Fees><Fee TaxInclusive="true" Type="Inclusive" Code="27" Amount="5.00"><Taxes Amount="0.45"/><Description Name="Commission"><Text>Commission - $5 flat fee</Text></Description></Fee></Fees><Total AmountAfterTax="583.25" CurrencyCode="USD"><Taxes Amount="53.01"><Tax Code="19" Percent="10" Amount="53.01"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><HotelReservationIDs><HotelReservationID ResID_Type="14" ResID_Value="RES_3243525"/></HotelReservationIDs><Profiles><ProfileInfo><UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/><Profile ProfileType="1"><Customer><PersonName><NamePrefix>Mr</NamePrefix><GivenName>James</GivenName><MiddleName>Herbert</MiddleName><Surname>Bond</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Telephone PhoneNumber="555-4321" PhoneUseType="4"/><Telephone PhoneNumber="0411444000" PhoneTechType="5"/><Telephone PhoneNumber="213451515" PhoneTechType="3"/><Email>james.bond@mi5.co.uk</Email><Address><AddressLine>Claretta House</AddressLine><AddressLine>Tower Bridge Close</AddressLine><CityName>London</CityName><PostalCode>EC1 2PG</PostalCode><StateProv>Middlesex</StateProv><CountryName>United Kingdom</CountryName><CompanyName>MI6</CompanyName></Address><CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2027-03-31"/></Customer></Profile></ProfileInfo><ProfileInfo><UniqueID Type="16" ID="4444" ID_Context="IATA"/><Profile ProfileType="3"><Customer><PersonName><NamePrefix>Joe</NamePrefix><Surname>Smith</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Address><CompanyName>American Express</CompanyName></Address></Customer></Profile></ProfileInfo><ProfileInfo><UniqueID Type="16" ID="STA" ID_Context="CHANNEL"/><UniqueID Type="16" ID="12312414" ID_Context="IATA"/><Profile ProfileType="4"><Customer><PersonName><NamePrefix>Mis</NamePrefix><Surname>Moneypenny</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Address><CompanyName>STA Travel</CompanyName></Address></Customer></Profile></ProfileInfo></Profiles><Comments><Comment><Text>will be arriving after 6 pm</Text></Comment></Comments><BasicPropertyInfo HotelCode="HOTELCODE"/></ResGlobalInfo></HotelReservation></HotelReservation></OTA_HotelResNotifRQ></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

</details>

<details>

<summary>Minimum Content XML</summary>

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:UsernameToken><wsse:Username>USERNAME</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body><OTA_HotelResNotifRQ xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" PrimaryLangID="en-us" ResStatus="Commit" Target="Production" TimeStamp="2024-07-06T15:27:41+00:00" Version="2.001"><HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book"><POS><Source><RequestorID Type="22" ID="SITEMINDER"/><BookingChannel Primary="true" Type="7"><CompanyName Code="EXP">Expedia</CompanyName></BookingChannel></Source></POS><UniqueID Type="14" ID="ABC-1234567890"/><UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/><RoomStays><RoomStay><RoomTypes><RoomType RoomTypeCode="DR"/></RoomTypes><RatePlans><RatePlan RatePlanCode="RAC" EffectiveDate="2027-03-12" ExpireDate="2027-03-15"/></RatePlans><RoomRates><RoomRate RoomTypeCode="DR" RatePlanCode="RAC" NumberOfUnits="1"><Rates><Rate UnitMultiplier="3" RateTimeUnit="Day" EffectiveDate="2027-03-12" ExpireDate="2027-03-15"/></Rates></RoomRate></RoomRates><GuestCounts><GuestCount AgeQualifyingCode="10" Count="1"/></GuestCounts><TimeSpan Start="2027-03-12" End="2027-03-15"/><BasicPropertyInfo HotelCode="HOTELCODE"/></RoomStay></RoomStays><ResGuests><ResGuest><Profiles><ProfileInfo><Profile ProfileType="1"><Customer><PersonName><GivenName>James</GivenName><Surname>Bond</Surname></PersonName></Customer></Profile></ProfileInfo></Profiles></ResGuest></ResGuests><ResGlobalInfo><HotelReservationIDs><HotelReservationID ResID_Type="14" ResID_Value="1234567890"/></HotelReservationIDs><BasicPropertyInfo HotelCode="HOTELCODE"/></ResGlobalInfo></HotelReservation></OTA_HotelResNotifRQ></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

</details>

## Common Questions

<details>

<summary>What happens if reservations fail to be delivered to my PMS?</summary>

SiteMinder times out the reservation after repeated failures.

The hotel receives an email advising them to contact their PMS provider. Always send delivery confirmation to prevent timeouts and ensure reservations are tracked.

</details>

<details>

<summary>Do I always receive both Before and After Tax amounts?</summary>

No. You receive whichever amounts the channel provides.

Some channels send both `AmountBeforeTax` and `AmountAfterTax`, others send only one. Your PMS must handle both scenarios.

</details>

<details>

<summary>Why don't the daily rates in reservations match the rates I sent?</summary>

There are three common scenarios:

**1. Channel Discounts or Promotions** The guest used a channel discount, so the final booked amount differs from your pushed rate.

**2. No Daily Rates Provided** Some channels only send the total stay cost. SiteMinder calculates daily rates by averaging the RoomStay Total across the number of nights.

**3. Missing Rates for Specific Dates** Channels may omit daily rates for certain dates (e.g., free night promotions). SiteMinder averages the RoomStay Total to determine daily rates.

</details>

<details>

<summary>Why is the reservation missing data that the property says was sent?</summary>

SiteMinder forwards all data received from booking channels without modification.

Missing data means the channel didn't provide it. The property must verify with the channel directly.

**Exception:** Credit card/document IDs may be disabled for PCI/PII compliance - contact Partner Integrations to enable.

</details>

<details>

<summary>What are the differences between Guests and Customers?</summary>

**Customer**: The contact person or individual who made the booking. Found in `ResGlobalInfo/Profile` with `Type="1"`.

**Guests**: The individuals who will check in and stay in the room. Found in `ResGuests/Profile`.

If the Customer is also staying in the room, they appear in both sections.

</details>

<details>

<summary>Why is <code>&#x3C;ResGuestRPHs></code> sometimes missing?</summary>

It's optional for single-guest reservations.

`<ResGuestRPHs>` links guests to room stays in multi-room/multi-guest bookings. For single-guest reservations, the association is implicit, so channels may omit this element.

</details>

<details>

<summary>Can I send multiple PMS reference IDs for reservations with multiple RoomStays?</summary>

No. Each UniqueID can only have one `ResID_Value` in SiteMinder.

If your PMS splits multi-RoomStay reservations into separate bookings, you cannot send multiple PMS reference IDs back in one reservation confirmation.

Channels rarely send multiple `RoomStays` with broken date ranges in one reservation. They typically create separate reservations, each with its own `UniqueID`, so each gets its own distinct `ResID_Value`.

</details>

<details>

<summary>Why do all extras get classified as "EXTRA"?</summary>

SiteMinder can only classify extras if the channel classifies them when sending the reservation.

Most channels (including Direct Booking test accounts) do not categorize extras according to the OTA standard, so they all appear as "EXTRA" by default.

Your PMS should handle extras with generic "EXTRA" classification as the most common scenario.

</details>

<details>

<summary>How do I identify which extras are booked for which room?</summary>

Match ServiceRPH values to link extras to rooms.

**Example:**

* `RoomStay/ServiceRPH@RPH="1"` → links to `Services/Service@ServiceRPH="1"`
* This associates that service with that specific RoomStay

</details>

<details>

<summary>Do you forward channel commissions?</summary>

Only if the channel provides commission details.

When commission information is available, SiteMinder includes it in the `Fees` section:

* Fixed commission amount in `Fee@Amount`
* Commission percentage in `Fee/Description`

Most channels do not provide commission data.

</details>

<details>

<summary>Do you support full credit card numbers?</summary>

Yes, when the channel provides them.

SiteMinder forwards full credit card numbers if provided by the channel. However, if a channel only provides partial information (typically 3-4 digits), you'll receive the partial card number in `PaymentCard@MaskedCardNumber`.

Hotels can obtain full card details from the channel's extranet or booking confirmation email if needed.

</details>

<details>

<summary>Can I receive the CVC/CVV code?</summary>

No. PCI regulations prohibit sending card number and CVC together.

Hotels can find CVC in:

* SiteMinder reservation confirmation emails (if enabled)
* Channel extranet

</details>

<details>

<summary>Do you support Virtual Credit Cards (VCC)?</summary>

Yes. Virtual credit cards are delivered as standard credit cards in the `PaymentCard` element.

There are no VCC-specific attributes - they use the same structure as regular credit cards (`CardNumber`, `CardCode`, `ExpireDate`, `CardHolderName`).

Your PMS processes VCCs the same way as standard credit cards.

</details>

<details>

<summary>Why am I not receiving credit card details or guest document IDs?</summary>

PCI/PII compliance restrictions prevent automatic delivery of sensitive data.

Contact Partner Integrations team to enable this data if your PMS is PCI compliant.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Pull (SM -> PMS)

Retrieve reservations from SiteMinder by polling at regular intervals.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Reservations · **Direction:** SM → PMS · **Method:** Pull (PMS-initiated)
{% endhint %}

## What is Reservations Pull (SM -> PMS)?

**Reservations Pull (SM -> PMS)** is a delivery method where the Property Management Systems (PMS) actively retrieve undelivered reservations, modifications, and cancellations from SiteMinder at regular intervals. This integration ensures that PMSs receive up-to-date booking information from various channels, maintaining consistency and reducing the risk of overbooking.

{% hint style="warning" %}
**Delivery Method Configuration**: The reservation delivery method (PUSH or PULL) is configured at the PMS level and applies to all properties using your integration. It is not possible to have some properties using Reservations PULL while others use Reservations PUSH. Once configured, all hotels connected to your PMS will retrieve reservations using the same method.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>SiteMinder will provide a single global endpoint for all hotels for PMS to send pull requests <code>OTA_ReadRQ</code> and receive reservation responses <code>OTA_ResRetrieveRS</code>.</li><li><strong>Test Environment Endpoint:</strong> <a href="https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D">https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}</a></li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>SiteMinder will provide a single username/password for all hotels (PMS Level authentication).</li><li>PMS must include authentication credentials within the <strong>SOAP Security header</strong> of each request (<code>OTA_ReadRQ</code> and <code>OTA_NotifReportRQ</code>).</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses will be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li></ul></td></tr></tbody></table>

## Message Exchange Flow

When using the pull method, your PMS requests reservations from SiteMinder at regular intervals (typically every 2-5 minutes) using a synchronous SOAP/HTTPS exchange. SiteMinder responds with any pending reservations, modifications, and cancellations that haven't been delivered yet. This process involves two request-response cycles to ensure reliable delivery and confirmation.

1. **Pull Request (PMS to SiteMinder)**: `OTA_ReadRQ`\
   Requests undelivered reservations, modifications, and cancellations from SiteMinder.
2. **Reservations Response (SiteMinder to PMS):** `OTA_ResRetrieveRS`\
   Delivers a list of reservations (new bookings, modifications, and cancellations) in response to the pull request.
3. **Confirmation Request (PMS to SiteMinder):** `OTA_NotifReportRQ`\
   Confirms successful receipt or reports processing failure of the received reservations by the PMS.
4. **Receipt Response (SiteMinder to PMS):** `OTA_NotifReportRS`\
   Acknowledges the confirmation and completes the pull transaction cycle.

{% hint style="warning" %}
The PMS must send `OTA_HotelAvailNotifRQ` to SiteMinder with the **updated availability** after the reservations, modifications, and cancellations are processed on the PMS system. Refer to the [Availability and Restrictions](/pmsxchange-api/reference/availability).
{% endhint %}

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from your PMS to SiteMinder endpoint. It contains the username and password credentials that we provide to the PMS during integration setup.

**Key Requirements:**

* **Validation**: Our endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Pull Request" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_ReadRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_ReadRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Reservations Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_ResRetrieveRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:45+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
			<Success/>
			<ReservationsList>
				<HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book">
					<UniqueID Type="14" ID="ABC-1234567890"/>
					<UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/>
					<!-- HOTEL RESERVATION DETAILS OMITTED -->
				</HotelReservation>
				<!-- Additional HotelReservation elements -->
			</ReservationsList>
		</OTA_ResRetrieveRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Request" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_NotifReportRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:50+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Success/>
			<NotifDetails>
				<HotelNotifReport>
					<HotelReservations>
						<HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book">
							<UniqueID Type="16" ID="isuokfr1pyc2ntest7"/>
							<ResGlobalInfo>
								<HotelReservationIDs>
									<HotelReservationID ResID_Type="14" ResID_Value="ABC-1234567890"/>
								</HotelReservationIDs>
							</ResGlobalInfo>
						</HotelReservation>
						<!-- Additional HotelReservation elements -->
					</HotelReservations>
				</HotelNotifReport>
			</NotifDetails>
		</OTA_NotifReportRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Receipt Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_NotifReportRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:57+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Success/>
		</OTA_NotifReportRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## 1. Pull Request

The PMS uses `OTA_ReadRQ` to pull reservations from SiteMinder at regular intervals between 2-5 minutes. The request frequency must be no more than every 2 minutes (e.g. not every 1 minute) and no less than every 5 minutes (e.g. not every 6 minutes).

{% hint style="info" %}
**PMS Level** requests all undelivered reservations for all hotels, while **Hotel Level** requests all undelivered reservations only for the hotel specified in the request. The PMS must chose only one level for the full connectivity and avoid using both levels.
{% endhint %}

{% tabs %}
{% tab title="PMS Level" %}
Returns all undelivered reservations, modifications, and cancellations for all hotels\
associated with PMS code: `{PMSCODE}`

**Requirements:** PMS Level authentication.

```xml
<OTA_ReadRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="{PMSCODE}"/>
		</Source>
	</POS>
	<ReadRequests>
		<HotelReadRequest>
			<SelectionCriteria SelectionType="Undelivered"/>
		</HotelReadRequest>
	</ReadRequests>
</OTA_ReadRQ>
```

{% endtab %}

{% tab title="Hotel Level" %}
Returns all undelivered reservations, modifications, and cancellations for a specific\
hotel with code: `{HOTELCODE}`

**Requirements:** Either PMS Level or Hotel Level authentication.

```xml
<OTA_ReadRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="{PMSCODE}"/>
		</Source>
	</POS>
	<ReadRequests>
		<HotelReadRequest HotelCode="{HOTELCODE}">
			<SelectionCriteria SelectionType="Undelivered"/>
		</HotelReadRequest>
	</ReadRequests>
</OTA_ReadRQ>
```

{% endtab %}

{% tab title="Book Only" %}
Returns only new reservations (`ResStatus="Book"`) for a specific hotel with code: `{HOTELCODE}`, excluding modifications and cancellations.

**Requirements:** Either PMS Level or Hotel Level authentication.

```xml
<OTA_ReadRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="{PMSCODE}"/>
		</Source>
	</POS>
	<ReadRequests>
		<HotelReadRequest HotelCode="{HOTELCODE}">
			<SelectionCriteria SelectionType="Undelivered" ResStatus="Book"/>
		</HotelReadRequest>
	</ReadRequests>
</OTA_ReadRQ>
```

{% endtab %}

{% tab title="Modify Only" %}
Returns only modifications (`ResStatus="Modify"`) for a specific hotel with code: `{HOTELCODE}`, excluding new reservations and cancellations.

**Requirements:** Either PMS Level or Hotel Level authentication.

```xml
<OTA_ReadRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="{PMSCODE}"/>
		</Source>
	</POS>
	<ReadRequests>
		<HotelReadRequest HotelCode="{HOTELCODE}">
			<SelectionCriteria SelectionType="Undelivered" ResStatus="Modify"/>
		</HotelReadRequest>
	</ReadRequests>
</OTA_ReadRQ>
```

{% endtab %}

{% tab title="Cancel Only" %}
Returns only cancellations (`ResStatus="Cancel"`) for a specific hotel with code: `{HOTELCODE}`, excluding new reservations and modifications.

**Requirements:** Either PMS Level or Hotel Level authentication.

```xml
<OTA_ReadRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="{PMSCODE}"/>
		</Source>
	</POS>
	<ReadRequests>
		<HotelReadRequest HotelCode="{HOTELCODE}">
			<SelectionCriteria SelectionType="Undelivered" ResStatus="Cancel"/>
		</HotelReadRequest>
	</ReadRequests>
</OTA_ReadRQ>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="129">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>OTA_ReadRQ</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated. TimeStamp must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>POS / Source / RequestorID</code></td><td>Element</td><td align="center">1</td><td>Identifies the system which is sending the request. Container for the PMS code.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Fixed at <code>22</code> (ESRP)</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>PMS Code assigned by SiteMinder. Remains the same throughout the messages.</td></tr><tr><td><code>ReadRequests</code></td><td>Element</td><td align="center">1</td><td></td></tr><tr><td><code>ReadRequests / HotelReadRequest</code></td><td>Element</td><td align="center">1</td><td></td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">0..1</td><td>Hotel code as recognised by SiteMinder. If omitted, all reservations for the PMS will be returned.<br><strong>Note:</strong> This attribute is only optional for central property management systems. It is mandatory for on-site systems.</td></tr><tr><td><code>SelectionCriteria</code></td><td>Element</td><td align="center">1</td><td></td></tr><tr><td><code>@SelectionType</code></td><td>String</td><td align="center">1</td><td>Must be "<code>Undelivered</code>"</td></tr><tr><td><code>@ResStatus</code></td><td>Enumeration</td><td align="center">0..1</td><td><p>Specifies the booking status:</p><p><code>Book</code></p><p><code>Modify</code></p><p><code>Cancel</code></p></td></tr></tbody></table>

## 2. Reservations Response

### OTA\_ResRetrieveRS

The `OTA_ResRetrieveRS` message returns a list of HotelReservation elements in response to the pull request. Content varies as SiteMinder aggregates reservations from multiple booking channels, each with different formats and data structures.

**Key Concepts**

#### ReservationsList

* Container element returned by SiteMinder in response to pull requests
* May contain zero, one, or multiple HotelReservation elements
* Empty when no pending reservations are available

#### HotelReservation

* Represents a single booking from one channel
* Multiple reservations can be returned in one ReservationsList
* Each includes all associated rooms, guests, and payments

#### RoomStays

* Container for all room bookings within each reservation
* Each room type booked creates a separate RoomStay
* Example: 2 Double Rooms + 1 Suite = 3 RoomStay elements

#### Split Stays

* When a guest changes room type during their stay
* Creates multiple RoomStays with different date ranges
* Example: Double Room (Jan 1-3) + Suite (Jan 3-5) = 2 RoomStays

#### Guest Assignment

* ResGuests can be linked to specific RoomStays via ResGuestRPH
* Some channels provide no guest details (ResGuests may be empty)
* Primary guest indicated by PrimaryIndicator="true"

#### Pricing Levels

Pricing data is structured across multiple levels. Different OTAs provide different levels of pricing details. SiteMinder passes through what the OTA provides to a PMS system. Always read all levels not just RoomStay Total alone.&#x20;

* Daily rates can be found at `RoomRates.RoomRate.Rates.Rate/BaseRoomRates.RoomRate.Rates.Rate/Base` - room charge per night, excluding extras
* When `Rate/Total` exceeds `Rate/Base`, extra charge is included in the daily rate. Service details for this extra are not guaranteed. OTA may embed charges in the total without providing a corresponding `Services` element&#x20;
* The RoomStay Total at `RoomStays.RoomStay.Total` covers all daily rates and any room-stay-level extras
* The ReservationTotal at `ResGlobalInfo.Total` is the authoritative total for the entire reservation. It includes all room stays + any services or extras applied at the reservation level. Always use this as the final amount for the reservation.

#### Batch Processing

* Single pull request can retrieve multiple reservations
* Each HotelReservation processed independently
* All retrieved reservations must be confirmed via `OTA_NotifReportRQ`

{% tabs %}
{% tab title="Reservations Found" %}

* Contains `<Success/>` element.
* Includes `<ReservationsList>` with one or more reservations.
* Each reservation has unique SiteMinder identifiers (e.g., `ABC-1234567890`, `CBA-0987654321`), with the corresponding message IDs (e.g., `isuokfr1pyc2ntest7` and `pbp6s5j08test9n0zi`).

```xml
<OTA_ResRetrieveRS
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:45+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<Success/>
	<ReservationsList>
		<HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book">
			<UniqueID Type="14" ID="ABC-1234567890"/> <!-- SiteMinder Reservation ID -->
			<UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/>
			<!-- HOTEL RESERVATION DETAILS OMITTED -->
		</HotelReservation>
		<HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book">
			<UniqueID Type="14" ID="CBA-0987654321"/> <!-- SiteMinder Reservation ID -->
			<UniqueID Type="16" ID="pbp6s5j08test9n0zi" ID_Context="MESSAGE_UNIQUE_ID"/>
			<!-- HOTEL RESERVATION DETAILS OMITTED -->
		</HotelReservation>
		<!-- Additional HotelReservation elements -->
	</ReservationsList>
</OTA_ResRetrieveRS>
```

{% endtab %}

{% tab title="No Reservations Found" %}

* Contains `<Success/>` element.
* No `<ReservationsList>` element (indicates no pending reservations).

```xml
<OTA_ResRetrieveRS
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:45+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<Success/>
</OTA_ResRetrieveRS>
```

{% endtab %}

{% tab title="Error" %}

* Contains `<Errors>` element instead of `<Success/>`
* Indicates business logic error (e.g., invalid hotel code, authentication failure)

```xml
<OTA_ResRetrieveRS
	xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:45+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c">
	<Errors>
		<Error Type="3" Code="392">Invalid Hotel Code</Error>
	</Errors>
</OTA_ResRetrieveRS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>OTA_ResRetrieveRS</code></strong></td><td>Element</td><td align="center">1</td><td>Root element</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated. TimeStamp must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version.<br>Must be set to <code>1.0</code></td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Either <code>Success</code> or <code>Error</code> element present.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Contains a list of errors.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">1</td><td>Type of error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-warning-types">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Code representing the error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-codes">Error Codes (ERR)</a>.</td></tr></tbody></table>

### ReservationsList

```xml
<ReservationsList>
	<HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book">
		<UniqueID Type="14" ID="ABC-1234567890"/>
		<UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/>
		<!-- HOTEL RESERVATION DETAILS OMITTED -->
	</HotelReservation>
	<HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book">
		<UniqueID Type="14" ID="CBA-0987654321"/>
		<UniqueID Type="16" ID="pbp6s5j08test9n0zi" ID_Context="MESSAGE_UNIQUE_ID"/>
		<!-- HOTEL RESERVATION DETAILS OMITTED -->
	</HotelReservation>
	<!-- Additional HotelReservation elements -->
</ReservationsList>
```

<table><thead><tr><th width="249.447021484375">Element / @Attribute</th><th width="121.357666015625">Type</th><th width="57" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ReservationsList</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains a list of retrieved reservations.</td></tr><tr><td><code>HotelReservation</code></td><td>Element</td><td align="center">1..n</td><td>Contains the specific reservation information.</td></tr><tr><td><code>@CreateDateTime</code></td><td>DateTime</td><td align="center">1</td><td>Date and time when the reservation was first made.<br><strong>Must be set when <code>ResStatus</code> is <code>Book</code>.</strong><br><code>CreateDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>@LastModifyDateTime</code></td><td>DateTime</td><td align="center">0..1</td><td>Date and time when the reservation was last modified.<br><strong>Must be set when <code>ResStatus</code> is <code>Modify</code> or <code>Cancel</code>.</strong><br><code>LastModifyDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>@ResStatus</code></td><td>Enumeration</td><td align="center">1</td><td><p>Specifies the booking status:</p><p><code>Book</code></p><p><code>Modify</code></p><p><code>Cancel</code></p></td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">1..2</td><td>Unique identifier of the reservation in SiteMinder.<br>- The <em><strong>first</strong></em> UniqueID <code>Type="14"</code>is the unique identifier for the entire reservation and through any subsequent modifications or cancellations.<br>The <em><strong>second</strong></em> UniqueID <code>Type="16"</code> with <code>ID_Context="MESSAGE_UNIQUE_ID"</code> is the unique ID for <strong>this</strong> <strong>message</strong>. This identifier must be used to confirm the message once processed.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><p><code>Type="14"</code>: Identifier for the reservation in SiteMinder.</p><p><code>Type="16"</code>: Identifier for the message transferring the reservation.</p></td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>SiteMinder reservation ID.<br>Refer to the <code>HotelReservationID</code> attribute for the booking source/channel reservation ID.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">0..1</td><td>Present for the second UniqueID and always will be "<code>MESSAGE_UNIQUE_ID</code>"</td></tr></tbody></table>

### Source

{% tabs %}
{% tab title="Source" %}

```xml
<POS>
    <Source>
        <RequestorID Type="22" ID="SITEMINDER"/>
        <BookingChannel Primary="true" Type="7">
            <CompanyName Code="ABC">Booking Channel</CompanyName>
        </BookingChannel>
    </Source>
    <!-- Additional Source element -->
</POS>
```

{% endtab %}

{% tab title="Second Source" %}

```xml
<POS>
    <Source>
        <RequestorID Type="22" ID="SITEMINDER"/>
        <BookingChannel Primary="true" Type="7">
            <CompanyName Code="ABC">Booking Channel</CompanyName>
        </BookingChannel>
    </Source>
    <Source>
        <BookingChannel Primary="false" Type="7">
            <CompanyName Code="ABCD">Booking Channel Affilate</CompanyName>
        </BookingChannel>
    </Source>
</POS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>POS</code></strong></td><td>Element</td><td align="center">1</td><td>Contains <code>Source</code> details.</td></tr><tr><td><code>Source</code></td><td>Element</td><td align="center">1..2</td><td>Contains <code>BookingChannel</code> details.</td></tr><tr><td><code>RequestorID</code></td><td>Element</td><td align="center">1</td><td>Only present in the first <code>Source</code> element. Identifies the system sending the reservation.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>22</code> (ESRP).</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Always <code>SITEMINDER</code></td></tr><tr><td><code>BookingChannel</code></td><td>Element</td><td align="center">1</td><td>Contains booking channel information.</td></tr><tr><td><code>@Primary</code></td><td>Boolean</td><td align="center">1</td><td><p><code>true</code> for the primary booking channel in the first Source element.</p><p><code>false</code> in the second Source element, if present.</p></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>7</code> for 'Internet'.</td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">1</td><td><p>Name of the Booking Channel.</p><p><strong>NOTE:</strong> This name is subject to change/variation by the Booking Channel. Use the <code>Code</code> attribute below to identify the booking channels.</p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Code of the booking channel.<br>See the <a href="/pages/MxQNXnNDdCYhYvgiZBu6">Booking Agent Codes Table</a> for reference.</td></tr></tbody></table>

### RoomStays

```xml
<RoomStays>
    <RoomStay MarketCode="Corporate" PromotionCode="STAYANDSAVE" SourceOfBusiness="Radio">
        <RoomTypes>
            <RoomType RoomType="Double Room" RoomTypeCode="DR" NonSmoking="true" Configuration="2 Beds and 1 cot">
                <!-- Additional RoomType elements -->
            </RoomType>
        </RoomTypes>
        <RatePlans>
                <!-- Additional RatePlan elements -->
            </RatePlan>
        </RatePlans>
        <RoomRates>
            <RoomRate RoomTypeCode="DR" RatePlanCode="RAC1" NumberOfUnits="1">
                <!-- Additional RoomRate elements -->
            </RoomRate>
        </RoomRates>
            <!-- Additional RoomStay elements -->
    </RoomStay>
</RoomStays>
```

<table><thead><tr><th width="252">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomStays</code></strong></td><td>Element</td><td align="center">1</td><td>Contains details of all room stays.</td></tr><tr><td><code>RoomStay</code></td><td>Element</td><td align="center">1..n</td><td>One instance of <code>RoomStay</code> per room type booked.</td></tr><tr><td><code>@PromotionCode</code></td><td>String</td><td align="center">0..1</td><td>If configured, this is the promotion code indicating, for instance, a specific marketing campaign (not the rate code).</td></tr><tr><td><code>@MarketCode</code></td><td>String</td><td align="center">0..1</td><td>A code to match a market segment for the booking.</td></tr><tr><td><code>@SourceOfBusiness</code></td><td>String</td><td align="center">0..1</td><td>Specifies where the business came from e.g. radio, newspaper ad, etc.</td></tr></tbody></table>

### RoomTypes

```xml
<RoomTypes>
    <RoomType RoomType="Double Room" RoomTypeCode="DR" NonSmoking="true" Configuration="2 Beds and 1 cot">
        <RoomDescription>
            <Text>Double room</Text>
        </RoomDescription>
        <AdditionalDetails>
            <AdditionalDetail Type="4" Code="PIA">
                <DetailDescription>
                    <Text>Room paid in advance with credit card</Text>
                </DetailDescription>
            </AdditionalDetail>
            <AdditionalDetail Type="5" Code="ECB">
                <DetailDescription>
                    <Text>Continental breakfast included</Text>
                </DetailDescription>
            </AdditionalDetail>
        </AdditionalDetails>
    </RoomType>
</RoomTypes>
```

<table><thead><tr><th width="255">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomTypes</code></strong></td><td>Element</td><td align="center">0..1</td><td>Provides more information about the room type for this room stay.</td></tr><tr><td><code>RoomType</code></td><td>Element</td><td align="center">0..1</td><td>Contains specific information about the room type.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the room booked.</td></tr><tr><td><code>@NonSmoking</code></td><td>Boolean</td><td align="center">0..1</td><td>Provided by the source channel.</td></tr><tr><td><code>@Configuration</code></td><td>String</td><td align="center">0..1</td><td>Information about the bedding configuration.</td></tr><tr><td><code>RoomDescription</code></td><td>Element</td><td align="center">0..1</td><td>Description of the room.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">0..1</td><td>Name of the room.</td></tr><tr><td><code>AdditionalDetails</code></td><td>Element</td><td align="center">0..1</td><td>Additional room information provided by the source channel.</td></tr><tr><td><code>AdditionalDetail</code></td><td>Element</td><td align="center">0..n</td><td></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><p>Refer to the <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/opentravel-codes-list#additional-detail-type-adt">Additional Detail Type (ADT)</a>.<br>Common usages are:</p><p><code>43</code> - Meal plan information<br><code>15</code> - Promotion information</p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Reference code provided by the source channel.</td></tr><tr><td><code>DetailDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Details provided by the source channel.</td></tr></tbody></table>

### RatePlans

```xml
<RatePlans>
    <RatePlan RatePlanCode="RAC1" EffectiveDate="2025-03-12" ExpireDate="2025-03-14" RatePlanName="RACK Rate1">
        <RatePlanDescription>
            <Text>Long Stay Discount</Text>
        </RatePlanDescription>
        <AdditionalDetails>
            <AdditionalDetail Type="15" Code="EB1">
                <DetailDescription>
                    <Text>Stay n Save promotion grants 10% discount</Text>
                </DetailDescription>
            </AdditionalDetail>
            <AdditionalDetail Type="43">
                <DetailDescription>
                    <Text>Continental breakfast included</Text>
                </DetailDescription>
            </AdditionalDetail>
        </AdditionalDetails>
    </RatePlan>
</RatePlans>
```

<table><thead><tr><th width="284">Element / @Attribute</th><th width="112">Type</th><th width="61" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RatePlans</code></strong></td><td>Element</td><td align="center">0..1</td><td>Provides more information about the rate plan for this room stay.</td></tr><tr><td><code>RatePlan</code></td><td>Element</td><td align="center">0..n</td><td>Contains details about the specific rate plan.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the rate booked.</td></tr><tr><td><code>@RatePlanName</code></td><td>String</td><td align="center">0..1</td><td>Name of the rate plan.</td></tr><tr><td><code>@EffectiveDate</code></td><td></td><td align="center">1</td><td>The effective date of the <code>RatePlan</code>.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">1</td><td>The expire date for a <code>RatePlan</code>, this should be considered an exclusive date, the date for which the current rate plan information is no longer valid.</td></tr><tr><td><code>RatePlanDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">0..1</td><td>Details provided about the rate plan.</td></tr><tr><td><code>AdditionalDetails</code></td><td>Element</td><td align="center">0..1</td><td>Additional rate plan information provided by the source channel.</td></tr><tr><td><code>AdditionalDetail</code></td><td>Element</td><td align="center">0..n</td><td></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><p>Refer to the <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/opentravel-codes-list#additional-detail-type-adt">Additional Detail Type (ADT)</a>.<br>Common usages are:</p><p><code>43</code> - Meal plan information<br><code>15</code> - Promotion information</p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Reference code provided by the source channel.</td></tr><tr><td><code>DetailDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Details provided by the source channel.</td></tr></tbody></table>

### RoomRates

{% tabs %}
{% tab title="Room Rates" %}

<pre class="language-xml"><code class="lang-xml"><strong>&#x3C;RoomRates>
</strong>    &#x3C;RoomRate RoomTypeCode="DR" RatePlanCode="RAC1" NumberOfUnits="1">
        &#x3C;Rates>
            &#x3C;Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2025-03-12" ExpireDate="2025-03-14">
                &#x3C;Base AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="USD">
                    &#x3C;Taxes Amount="10.00">
                        &#x3C;Tax Code="19" Percent="10" Amount="10.00">
                            &#x3C;TaxDescription>
                                &#x3C;Text>GST 10 percent&#x3C;/Text>
                            &#x3C;/TaxDescription>
                        &#x3C;/Tax>
                    &#x3C;/Taxes>
                &#x3C;/Base>
                &#x3C;Total AmountBeforeTax="102.50" AmountAfterTax="112.75" CurrencyCode="USD">
                    &#x3C;Taxes Amount="10.25">
                        &#x3C;Tax Code="19" Percent="10" Amount="10.25">
                            &#x3C;TaxDescription>
                                &#x3C;Text>GST 10 percent&#x3C;/Text>
                            &#x3C;/TaxDescription>
                        &#x3C;/Tax>
                    &#x3C;/Taxes>
                &#x3C;/Total>
            &#x3C;/Rate>
            &#x3C;!-- Additional Rate -->
        &#x3C;/Rates>
        &#x3C;ServiceRPHs>
            &#x3C;ServiceRPH RPH="1"/>
            &#x3C;!-- Additional ServiceRPH -->
        &#x3C;/ServiceRPHs>
    &#x3C;/RoomRate>
    &#x3C;!-- Additional RoomRate -->
&#x3C;/RoomRates>
</code></pre>

{% endtab %}

{% tab title="Same Rate per Night" %}

```xml
<RoomRates>
   <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
      <Rates>
         <Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2025-10-05" ExpireDate="2025-10-07">
	    <Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	    <Total AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	 </Rate>
      </Rates>
   </RoomRate>
</RoomRates>
<TimeSpan Start="2025-10-05" End="2025-10-07"/>
<Total AmountBeforeTax="306.00" AmountAfterTax="340.00" CurrencyCode="EUR">
```

{% endtab %}

{% tab title="Same Rate per Night + Extras" %}
This example shows daily rates when the same rate applies to both dates (2025-10-05 and 2025-10-06) and there are additional charges.

```xml
<RoomRates>
   <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
      <Rates>
         <Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2025-10-05" ExpireDate="2025-10-07">
	    <Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	    <Total AmountBeforeTax="170.00" AmountAfterTax="188.00" CurrencyCode="EUR"/>
	 </Rate>
      </Rates>
   </RoomRate>
</RoomRates>
<TimeSpan Start="2025-10-05" End="2025-10-07"/>
<Total AmountBeforeTax="340.00" AmountAfterTax="376.00" CurrencyCode="EUR">
```

{% endtab %}

{% tab title="Different Rate per Night" %}

```xml
<RoomRates>
   <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
      <Rates>
         <Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2025-10-05" ExpireDate="2025-10-06">
	    <Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
	    <!-- ... other elements and attributes have been omitted for brevity ... -->
	 </Rate>
	 <Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2025-10-06" ExpireDate="2025-10-07">
            <Base AmountBeforeTax="180.00" AmountAfterTax="200.00" CurrencyCode="EUR"/>
	    <!-- ... other elements and attributes have been omitted for brevity ... -->
	 </Rate>
	 <Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2025-10-07" ExpireDate="2025-10-08">
            <Base AmountBeforeTax="225.00" AmountAfterTax="250.00" CurrencyCode="EUR"/>
	    <!-- ... other elements and attributes have been omitted for brevity ... -->
	 </Rate>
      </Rates>
   </RoomRate>
</RoomRates>
<TimeSpan Start="2025-10-05" End="2025-10-08"/>  
<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="128">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomRates</code></strong></td><td>Element</td><td align="center">1</td><td>A <code>RoomStay</code> can include multiple <code>RoomRate</code>, each containing several rates. This occurs when a single room is booked, but different rate plans apply across the duration of the stay.</td></tr><tr><td><code>RoomRate</code></td><td>Element</td><td align="center">1..n</td><td>One RoomRate per RoomStay. Multiple rates are listed under the RoomRate.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">1</td><td>Code of the room booked.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">1</td><td>Code of the rate plan booked.</td></tr><tr><td><code>@NumberOfUnits</code></td><td>Integer</td><td align="center">1</td><td>Always <code>1</code>. Each room will be listed in it's own RoomStay element.</td></tr><tr><td><code>Rates</code></td><td>Element</td><td align="center">0..1</td><td>Rate will contain a timespan for which a rate will apply for a room type. Multiple instances of Rate will be sent if rate changes apply.</td></tr><tr><td><code>Rate</code></td><td>Element</td><td align="center">1..n</td><td>Contains the daily rate information which matches the entire date range specified in the <code>RoomStay/TimeSpan</code> element.</td></tr><tr><td><code>@UnitMultiplier</code></td><td>Integer</td><td align="center">1</td><td>Equal to the number of days between <code>EffectiveDate</code> and <code>ExpireDate</code>. Multiply with the <code>UnitMultiplier</code> to get the total cost for the date span.</td></tr><tr><td><code>@RateTimeUnit</code></td><td>String</td><td align="center">1</td><td>Always <code>Day</code>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">1</td><td>Starting date of the rate. This date is inclusive.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">1</td><td>First day after the applicable period. This date is exclusive.</td></tr><tr><td><code>Base</code></td><td>Element</td><td align="center">0..1</td><td>Base/Gross <strong>per-day</strong> amount charged for the room.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The unit amount before tax.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The unit amount after tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>The unit tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax percentage.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the tax description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">0..1</td><td><p>Base Rate + any additional occupants and fees/extras.<br>If empty, assume the Base amount equals the Total amount.<br></p><p><strong>NOTE:</strong> It is possible that some OTAs do not provide any form of Rate information and as such a RoomRate / Rate / Total cannot be provided in such cases. Currently Hotelbeds (HBD) is a known channel that does not always provide Rate information.</p><p><strong>NOTE</strong>: Any extras that are to be included in the RoomRate total will be linked through the ServiceRPH node.</p></td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount before tax.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount after tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the total taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>The total tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@Percentage</code></td><td></td><td align="center">0..1</td><td>Tax percentage.</td></tr><tr><td><code>TaxDescription</code></td><td></td><td align="center">0..1</td><td>Text description of the tax.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td></td></tr><tr><td><code>ServiceRPHs</code></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ServiceRPH</code> elements.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">0..n</td><td>Links a service to the Service information at the <code>RoomRate</code> level.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1..n</td><td>Links a <code>Service</code> to the Service information provided at the HotelReservation level (if applicable) to this <code>RoomRate</code>.</td></tr></tbody></table>

### **GuestCounts**

```xml
<GuestCounts>
	<GuestCount AgeQualifyingCode="10" Count="2"/>
	<GuestCount AgeQualifyingCode="8" Count="1"/>
	<GuestCount AgeQualifyingCode="7" Count="1"/>
</GuestCounts>
```

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>GuestCounts</code></strong></td><td>Element</td><td align="center">1</td><td>Total guest counts for adult, child, and infant. Adult count must always be sent.</td></tr><tr><td><code>GuestCount</code></td><td>Element</td><td align="center">1..3</td><td><p>Represents the count for a specific age group.</p><p><br></p></td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">1</td><td><p><code>10</code> - Adult (mandatory)</p><p><code>8</code> - Child (optional)</p><p><code>7</code> - Infant (optional)</p></td></tr><tr><td><code>@Count</code></td><td>Integer</td><td align="center">1</td><td>Number of guests for this age group.</td></tr></tbody></table>

### TimeSpan

```xml
<TimeSpan Start="2025-10-05" End="2025-10-08"/>
```

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>TimeSpan</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the timespan for the <code>RoomStay</code>.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>Check-in date.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>Check-out date. Must be after Start.</td></tr></tbody></table>

### RoomStay Total

{% hint style="info" %}
This total covers the room stay only. It does not include services or extras applied at the reservation level. See [Reservation Total](https://developer.siteminder.com/pmsxchange-api/reference/reservations/push#reservationtotal) for the complete reservation amount.
{% endhint %}

```xml
<Total CurrencyCode="USD" AmountBeforeTax="500.00" AmountAfterTax="615.00">
    <Taxes Amount="115.00">
        <Tax Amount="50.00" Code="10">
            <TaxDescription>
                <Text>Occupancy Tax</Text>
            </TaxDescription>
        </Tax>
        <Tax Amount="65.00" Code="13">
            <TaxDescription>
                <Text>Sales Tax</Text>
            </TaxDescription>
        </Tax>
    </Taxes>
</Total>
```

<table><thead><tr><th width="251">Element / @Attribute</th><th width="134">Type</th><th width="61" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Total</code></strong></td><td>Element</td><td align="center">0..1</td><td>The total amount of the <code>RoomStay</code>.<br></td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount before tax.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount after tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>The total tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Amount of the tax/fee transferred.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax percentage.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Contains the tax description <code>Text</code>.</td></tr><tr><td><code>@Text</code></td><td>String</td><td align="center">1</td><td>Text description of the tax</td></tr></tbody></table>

### **BasicPropertyInfo**

```xml
<BasicPropertyInfo HotelCode="HOTELCODE" HotelName="The Hotel Name"/>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>BasicPropertyInfo</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains basic identification details for the hotel associated with the reservation.<br><code>BasicPropertyInfo</code> will always be sent as either part of the <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">RoomStay</a> or <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGlobalInfo</a>, depending on your setup in SiteMinder. We recommend receiving the <code>BasicPropertyInfo</code> as part of the <code>ResGlobalInfo</code> due to how Booking.com cancellation messages are sent.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>@HotelName</code></td><td>String</td><td align="center">0..1</td><td>Name of the hotel.</td></tr></tbody></table>

### ServiceRPHs

```xml
<ServiceRPHs>
	<ServiceRPH RPH="1"/>
	<!-- Additional ServiceRPH elements -->
</ServiceRPHs>
```

<table><thead><tr><th width="256">Element / @Attribute</th><th width="112">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ServiceRPHs</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ServiceRPH</code> elements.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">1..n</td><td>Service at the <code>RoomStay</code> level.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links a <code>Service</code> to the Service information provided at the HotelReservation level (if applicable).</td></tr></tbody></table>

### ResGuestRPHs

```xml
<ResGuestRPHs>
	<ResGuestRPH RPH="1"/>
	<!-- Additional ResGuestRPH elements -->
</ResGuestRPHs>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGuestRPHs</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ResGuestRPH</code> elements.</td></tr><tr><td><code>ResGuestRPH</code></td><td>Element</td><td align="center">1..n</td><td>Container for the <code>RPH</code> attribute.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links the <code>RoomStay</code> to <code>ResGuest</code>. Find the links in <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGuests</a>.</td></tr></tbody></table>

### **Comments**

```xml
<Comments>
	<Comment>
		<Text>See the room stay comments here</Text>
	</Comment>
</Comments>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Comments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains comment for the <code>RoomStay</code>.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1..n</td><td>Holds the actual comment.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>The content of the comment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### Services

Extras and services in reservation XML can be identified through multiple attributes. Use this multi-layered approach to ensure reliable mapping:

**1. Use the ID attribute**: Map extras using the `@ID` attribute when present. This is the channel's unique identifier for the specific extra or service.

**2. Use ServiceInventoryCode**: If `@ID` is not provided, use the `@ServiceInventoryCode` attribute, which is always present. Reference the Service and Extra Charge table for commonly used codes, or request the complete code list from the hotelier for their specific connected channels.

**3. Keyword Detection**: Implement keyword detection logic that scans `<RateDescription><Text>` for common terms like "Parking," "Breakfast," "Spa," etc. This ensures that extras sent under different codes (`EXTRA`, `MEAL`, `OTHER`) by various channels are still correctly matched in your PMS, even when codes vary between booking sources.

```xml
<Services>
    <Service ServiceInventoryCode="EXTRA_BED" ID="12346" ServiceRPH="1" Inclusive="true" Quantity="1" ID_Context="CHANNEL" Type="18">
        <Price>
            <Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="EUR">
                <Taxes Amount="0.25">
                    <Tax Code="19" Percent="10" Amount="0.25">
                        <TaxDescription>
                            <Text>GST 10 percent</Text>
                        </TaxDescription>
                    </Tax>
                </Taxes>
            </Base>
            <Total AmountBeforeTax="5.00" AmountAfterTax="5.50" CurrencyCode="EUR">
                <Taxes Amount="0.50">
                    <Tax Code="19" Percent="10" Amount="0.50">
                        <TaxDescription>
                            <Text>GST 10 percent</Text>
                        </TaxDescription>
                    </Tax>
                </Taxes>
            </Total>
            <RateDescription>
                <Text>Extra person charge EUR 2.50 per day for cot</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-03-12" End="2025-03-14"/>
        </ServiceDetails>
    </Service>
    <!-- Additional Service elements -->
</Services>
```

<table><thead><tr><th width="262">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Services</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains service details provided to guests.</td></tr><tr><td><code>Service</code></td><td>Element</td><td align="center">1..n</td><td>Represents a non-room product provided to guests.</td></tr><tr><td><code>@ServiceInventoryCode</code></td><td>String</td><td align="center">1</td><td>Identifier code for the service. Refer to <a href="/pages/CiYdiVL1WUiiuWGcKNmx">Service and Extra Charge</a>. Channels/OTA's will use this list as a guide to code the extras/services or can use their own codes as well. Please request the property or the channel for the full list of extras/services and the codes configured in each channel.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Reference ID for the extra/service provided by the source booking channel.</td></tr><tr><td><code>@ServiceRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>Service</code> to a <code>RoomStay</code> or <code>RatePlan</code>. <code>ServiceRPH</code> absence indicates a HotelReservation-level charge.</td></tr><tr><td><code>@Inclusive</code></td><td>Boolean</td><td align="center">1</td><td>Must be set to <code>TRUE</code>, as SiteMinder reports totals as inclusive of charges and extras.</td></tr><tr><td><code>@Quantity</code></td><td>Integer</td><td align="center">1</td><td>Number of units included in the charge. This value does not affect the total amount.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">0..1</td><td>Always <code>CHANNEL</code></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>18</code></td></tr><tr><td><code>Price</code></td><td>Element</td><td align="center">1</td><td>Container for pricing details of the service.</td></tr><tr><td><code>Base</code></td><td>Element</td><td align="center">0..1</td><td>Base amount <strong>per unit</strong> charged for the service.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Total taxes amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a detailed description of the tax.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>Container for the total amount of the service.</td></tr><tr><td><code>@CurrencyCode</code></td><td></td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Total taxes amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a detailed description of the tax.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>RateDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a description of the rate applied to the service.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>A text description of the service/extra.</td></tr><tr><td><code>ServiceDetails</code></td><td>Element</td><td align="center">0..1</td><td>Container for additional service details.</td></tr><tr><td><code>TimeSpan</code></td><td>Element</td><td align="center">0..1</td><td>Contains the time span for which the service is provided.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">0..1</td><td>Start date of service.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">0..1</td><td>Last date of service.</td></tr></tbody></table>

### ResGuests

```xml
<ResGuests>
    <ResGuest ResGuestRPH="1" ArrivalTime="10:30:00" Age="8" PrimaryIndicator="true">
        <Profiles>
            <ProfileInfo>
                <UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/>
                <Profile ProfileType="1">
                    <Customer>
                        <PersonName>
                            <NamePrefix>Mr</NamePrefix>
                            <GivenName>James</GivenName>
                            <MiddleName>Herbert</MiddleName>
                            <Surname>Bond</Surname>
                        </PersonName>
                        <Telephone PhoneNumber="555-1234"/>
                        <Telephone PhoneNumber="555-4321" PhoneUseType="4"/>
                        <Telephone PhoneNumber="0411444000" PhoneTechType="5"/>
                        <Telephone PhoneNumber="213451515" PhoneTechType="3"/>
                        <Email>james.bond@mi5.co.uk</Email>
                        <Address>
                            <AddressLine>Claretta House</AddressLine>
                            <AddressLine>Tower Bridge Close</AddressLine>
                            <CityName>London</CityName>
                            <PostalCode>EC1 2PG</PostalCode>
                            <StateProv>Middlesex</StateProv>
                            <CountryName>United Kingdom</CountryName>
                        </Address>
                        <CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2017-03-31"/>
                    </Customer>
                </Profile>
            </ProfileInfo>
        </Profiles>
        <Comments>
            <Comment Name="ArrivalDetails">
                <Text>Arriving by coach</Text>
            </Comment>
            <Comment Name="DepartureDetails">
                <Text>Departure flight QF123</Text>
            </Comment>
        </Comments>
    </ResGuest>
    <!-- Additional ResGuest elements -->
</ResGuests>
```

<table><thead><tr><th width="260">Element / @Attribute</th><th width="112">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGuests</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the guests for the reservation.</td></tr><tr><td><code>ResGuest</code></td><td>Element</td><td align="center">1..n</td><td>Contains the specific guest details.</td></tr><tr><td><code>@ResGuestRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>ResGuest</code> to <code>RoomStay</code>. Find the links in <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGuestRPHs</a>.</td></tr><tr><td><code>@PrimaryIndicator</code></td><td>Boolean</td><td align="center">0..1</td><td><p>Indicates the primary guest on a reservation:<br><code>1</code> - primary guest</p><p><code>0</code> - secondary guests</p></td></tr><tr><td><code>@Age</code></td><td>Integer</td><td align="center">0..1</td><td>The age of the guest</td></tr><tr><td><code>@ArrivalTime</code></td><td>Time</td><td align="center">0..1</td><td>Arrival time of the guest.</td></tr><tr><td><code>Profiles</code></td><td>Element</td><td align="center">1</td><td>Contains the guest profile information.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td align="center">1</td><td>Contains the profile information for the guest.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">0..n</td><td>Contains profile ids provided by the source channel.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>16</code></td></tr><tr><td><code>@ID</code></td><td></td><td align="center">1</td><td>The reference identifier for the profile as provided by the source channel.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">1</td><td><code>CHANNEL</code> - To specify that this is a channel reference id/</td></tr><tr><td><code>Profile</code></td><td>Element</td><td align="center">1</td><td>Contains detailed customer profile information.</td></tr><tr><td><code>@ProfileType</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>1</code> (Customer).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td align="center">1</td><td>Contains detailed guest information.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">1</td><td>Contains the name information for the guest.</td></tr><tr><td><code>@NamePrefix</code></td><td>String</td><td align="center">0..1</td><td>Title of the guest:<br>Mr. Mrs. Ms. Miss Dr.</td></tr><tr><td><code>@GivenName</code></td><td>String</td><td align="center">1</td><td>First name of the guest.</td></tr><tr><td><code>@MiddleName</code></td><td>String</td><td align="center">0..1</td><td>Middle name of the guest.</td></tr><tr><td><code>@Surname</code></td><td>String</td><td align="center">1</td><td>Last name of the guest.</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..4</td><td>Contains telephone information related to the guest.</td></tr><tr><td><code>@PhoneNumber</code></td><td>String</td><td align="center">1</td><td>Contains the actual number (maximum 32 characters).</td></tr><tr><td><code>@PhoneUseType</code></td><td>Integer</td><td align="center">0..1</td><td>The type of phone use for example daytime, nighttime, work. If this field is blank this is the primary phone, otherwise PhoneUseType="4" denotes a secondary or nighttime phone</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td align="center">0..1</td><td><p>The type of phone technology. If not provided it should be assumed as a landline:</p><p><code>5</code> - Mobile<br><code>3</code> - Fax</p></td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..1</td><td>Contact email address.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..1</td><td>Address information of the guest.</td></tr><tr><td><code>@AddressLine</code></td><td>String</td><td align="center">0..n</td><td>Address lines for the guest.</td></tr><tr><td><code>@CityName</code></td><td>String</td><td align="center">0..1</td><td>City of residence.</td></tr><tr><td><code>@PostalCode</code></td><td>String</td><td align="center">0..1</td><td>Postal code.</td></tr><tr><td><code>@StateProv</code></td><td>String</td><td align="center">0..1</td><td>State or province name.</td></tr><tr><td><code>@CountryName</code></td><td>String</td><td align="center">0..1</td><td>Contains country information (maximum 64 characters). This is a free-text field, so a variety of formats may be received—for example: <em>Australia</em>, <em>AUS</em>, <em>AU</em>, etc.</td></tr><tr><td><code>CustLoyalty</code></td><td>Element</td><td align="center">0..1</td><td>Contains loyalty information for the customer.</td></tr><tr><td><code>@ProgramID</code></td><td>String</td><td align="center">0..1</td><td>The code or name of the membership program ('Hertz', 'AAdvantage', etc.).</td></tr><tr><td><code>@MembershipID</code></td><td>String</td><td align="center">0..1</td><td>Account identification number for this particular member in this particular program.</td></tr><tr><td><code>@ExpiryDate</code></td><td>Date</td><td align="center">0..1</td><td>Expiry date for this particular membership record in this particular program.</td></tr><tr><td><code>Document</code></td><td>Element</td><td align="center">0..1</td><td>Detailed document information for the guest.</td></tr><tr><td><code>@BirthCountry</code></td><td>String</td><td align="center">0..1</td><td>Birth country of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@BirthDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the date of birth as indicated in the document. Use <code>ISO 8601</code> date format.</td></tr><tr><td><code>@BirthPlace</code></td><td>String</td><td align="center">0..1</td><td>Specifies the birth place of the document holder (e.g., city, state, county, province).</td></tr><tr><td><code>@DocHolderNationality</code></td><td>String</td><td align="center">0..1</td><td>Country of nationality of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocID</code></td><td>String</td><td align="center">1</td><td>Unique number assigned by authorities to the document.</td></tr><tr><td><code>@DocIssueAuthority</code></td><td>String</td><td align="center">0..1</td><td>Indicates the group or association that granted the document.</td></tr><tr><td><code>@DocIssueCountry</code></td><td>String</td><td align="center">0..1</td><td>Country where the document was issued. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocIssueLocation</code></td><td>String</td><td align="center">0..1</td><td>Indicates the location where the document was issued.</td></tr><tr><td><code>@DocIssueStateProv</code></td><td>String</td><td align="center">0..1</td><td>State or Province where the document was issued.</td></tr><tr><td><code>@DocType</code></td><td>String</td><td align="center">1</td><td>Indicates the type of document. Refer to <a href="/pages/mZ5VhSA8q98aQtJqawjh">Document Type Code (DOC)</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the ending date.</td></tr><tr><td><code>@Gender</code></td><td>String</td><td align="center">0..1</td><td><p>Identifies the gender:</p><p><code>Female</code></p><p><code>Male</code></p><p><code>Unknown</code></p></td></tr><tr><td><code>DocumentHolderName</code></td><td>Element</td><td align="center">0..1</td><td>The name of the document holder in unformatted text (Mr. Sam Jones). If no <code>DocumentHolderName</code> is included, the guest name fields will be assumed as the holder name.</td></tr><tr><td><code>Comments</code></td><td>Element</td><td align="center">0..1</td><td>Container for extra information about the guest.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">0..2</td><td>Holds the actual comment.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">0..1</td><td><p>Identifier for the comment. Current supported names are:</p><p><code>ArrivalDetails</code><strong>:</strong> Details about the guest's mode of arrival.<br><code>DepartureDetails</code><strong>:</strong> Details about the guest's mode of departure.</p></td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>The content of the comment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### ResGlobalInfo

```xml
<ResGlobalInfo>
	<HotelReservationIDs>
		<HotelReservationID ResID_Type="14" ResID_Value="1234567890"/> <!-- OTA Reservation ID -->
		<HotelReservationID ResID_Type="26" ResID_Value="987654321"/> <!-- Itinerary ID -->
		<HotelReservationID ResID_Type="34" ResID_Value="74a63a92-d988-46b8-8476-3319285af8ac"/> <!-- Payment Context ID -->
	</HotelReservationIDs>
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGlobalInfo>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGlobalInfo</code></strong></td><td>Element</td><td align="center">1</td><td>Contains global information about the reservation.</td></tr><tr><td><code>HotelReservationIDs</code></td><td>Element</td><td align="center">0..1</td><td>Contains the <code>HotelReservationID</code>.</td></tr><tr><td><code>HotelReservationID</code></td><td>Element</td><td align="center">0..3</td><td>Reference number/string or PNR as supplied by the booking channel.<br>If this reservation is linked under an itinerary, the itinerary ID will be supplied as a second <code>HotelReservationID</code>.</td></tr><tr><td><code>@ResID_Type</code></td><td>String</td><td align="center">1</td><td><p>Will be one of the following values:</p><p><code>14</code> - OTA code for 'Travel Agent PNR'.</p><p><code>26</code> - OTA code for 'Associated itinerary reservation'.</p><p><code>34</code> - OTA code for “Master Reference”.</p></td></tr><tr><td><code>@ResID_Value</code></td><td>String</td><td align="center">1</td><td><p>For <code>@ResID_Type 14</code> this is the actual reference number/string supplied by the booking channel (maximum 64 characters).</p><p>For <code>@ResID_Type 26</code> will be the itinerary identifier for one or more bookings in an itinerary as provided by the source booking channel.</p><p><br>For <code>@ResID_Type 34</code> this is the reference number/string used as identifier for payment transaction. Refer to <a href="/pages/Zy5xk8cPknCwaamkKKyl">Payment Transaction Record</a>.</p><p><br><code>ResID_Value</code> could potentially contain special characters such as <code>/</code>.</p></td></tr></tbody></table>

### **ResComments**

```xml
<Comments>
	<Comment>
		<Text>See the reservation comments here</Text>
	</Comment>
	<!-- Additional Comment elements -->
</Comments>
```

<table><thead><tr><th width="234">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Comments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains comment for the reservation.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1..n</td><td>Holds the actual comment.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">1</td><td><p>Content of the comment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### ReservationTotal

```xml
<Total CurrencyCode="EUR" AmountBeforeTax="558.00" AmountAfterTax="620.00">
	<Taxes Amount="62.00">
		<Tax Code="35" Amount="62.00" Percent="10" CurrencyCode="EUR"/>
	</Taxes>
</Total>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Total</code></strong></td><td>Element</td><td align="center">0..1</td><td>Total amount for the reservation. This includes all <code>RoomStays</code> and any additional fees or charges that apply.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Total tax amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@Percent</code></td><td></td><td align="center">0..1</td><td>Tax percentage applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr></tbody></table>

### Memberships

```xml
<Memberships>
    <Membership ProgramCode="AAdvantage" AccountID="AA14567890"/>
</Memberships>
```

<table><thead><tr><th width="234">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Memberships</code></strong></td><td>Element</td><td align="center">0..1</td><td>A list of Memberships. Memberships provides a list of reward programs. This data is taken from <code>ResGuest / CustLoyalty</code>.</td></tr><tr><td><code>Membership</code></td><td>Element</td><td align="center">0..n</td><td></td></tr><tr><td><code>ProgramCode</code></td><td>String</td><td align="center">0..1</td><td>The code or name of the membership program ('Hertz', 'AAdvantage', etc.). Equivalent to <code>ProgramID</code>.</td></tr><tr><td><code>AccountID</code></td><td>String</td><td align="center">0..1</td><td>The account identification number for this particular member in this particular program. Equivalent to <code>MembershipID</code>.</td></tr></tbody></table>

### Fees

```xml
<Fees>
    <Fee TaxInclusive="true" Type="Inclusive" Code="27" Amount="5.00">
        <Taxes Amount="0.45"/>
        <Description Name="Commission">
            <Text>Commission - $5 flat fee</Text>
        </Description>
    </Fee>
</Fees>
```

<table><thead><tr><th width="234">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Fees</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for added fees/commission.</td></tr><tr><td><code>Fee</code></td><td>Element</td><td align="center">1..n</td><td>The actual fees/commission.</td></tr><tr><td><code>@TaxInclusive</code></td><td>String</td><td align="center">1</td><td><p>Content of the comment.</p><p>PCI sensitive data is prohibited.</p></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>Inclusive</code></td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">1</td><td>See <a href="https://siteminder.atlassian.net/wiki/pages/viewpage.action?pageId=1602940">OTA Fee Tax Type (FTT)</a> code table.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Commission amount.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Taxes amount.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Actual tax amount.</td></tr><tr><td><code>Description</code></td><td>Element</td><td align="center">0..1</td><td>Container of the comission <code>Text</code>.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">0..1</td><td><code>Commission</code> against the total of the reservation.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..1</td><td>A description of the fee.</td></tr></tbody></table>

### **Guarantee**

If the PMS is not PCI compliant, it will **not** receive credit card information directly. However, you can choose to work with a proxy service provider for [**credit card tokenization**](/pmsxchange-api/additional-resources/credit-card-tokenization).

{% tabs %}
{% tab title="Credit Card" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted>
            <PaymentCard CardCode="VI" CardType="1" CardNumber="4444444444444444" ExpireDate="1114">
                <CardHolderName>John Smith</CardHolderName>
            </PaymentCard>
        </GuaranteeAccepted>
    </GuaranteesAccepted>
    <Comments>
        <Comment Name="PaymentReferenceId">
            <Text>123124151616</Text>
        </Comment>
    </Comments>
    <GuaranteeDescription>
        <Text>Payment accepted up front</Text>
    </GuaranteeDescription>
</Guarantee>
```

{% endtab %}

{% tab title="ThreeDomainSecurity" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted>
            <PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" ExpireDate="1234">
                <CardHolderName>John Smith</CardHolderName>
                <ThreeDomainSecurity>
                    <Results ThreeDSVersion="1.0.2" XID="z9UKb06xLziZMOXBEmWSVA1kwG0=" CAVV="MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=" ECI="05" />
                </ThreeDomainSecurity>
            </PaymentCard>
        </GuaranteeAccepted>
    </GuaranteesAccepted>
</Guarantee>
```

{% endtab %}

{% tab title="Payment Gateway" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted/>
    </GuaranteesAccepted>
    <Comments>
        <Comment Name="PaymentGatewayName">
            <Text>Paypal</Text>
        </Comment>
        <Comment Name="PaymentGatewayAuthCode">
            <Text>123143253467</Text>
        </Comment>
        <Comment Name="PaymentReferenceId">
            <Text>123124151616</Text>
        </Comment>
    </Comments>
    <GuaranteeDescription>
        <Text>Payment accepted up front</Text>
    </GuaranteeDescription>
</Guarantee>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="274">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Guarantee</code></strong></td><td>Element</td><td align="center">0..1</td><td>Guarantee provided with the reservation. Used if no deposit is paid for the reservation.</td></tr><tr><td><code>GuaranteesAccepted</code></td><td>Element</td><td align="center">1</td><td>Contains the details of accepted guarantees.</td></tr><tr><td><code>GuaranteeAccepted</code></td><td>Element</td><td align="center">1</td><td>Specific details of the accepted guarantee.</td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">1</td><td>Details of the payment card used for the guarantee.</td></tr><tr><td><code>@CardType</code></td><td>String</td><td align="center">0..1</td><td>Must be set to <code>1</code> (Credit Card) or <code>2</code> (Debit Card).</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">1</td><td>2-character code of the credit card issuer. Refer to <a href="/pages/Iqs1qAbBKAcBqhyyZHQt">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@CardNumber</code></td><td>String</td><td align="center">0..1</td><td>Actual credit card number.</td></tr><tr><td><code>@ExpireDate</code></td><td>String</td><td align="center">0..1</td><td>Expiry date of the credit card (format <code>MMyy</code>).</td></tr><tr><td><code>@MaskedCardNumber</code></td><td>String</td><td align="center">0..1</td><td>May be used to send a concealed or partial credit card number (e.g. "xxxxxxxxxxxx4444" or "4444").</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td align="center">0..1</td><td>Name of the cardholder.</td></tr><tr><td><code>ThreeDomainSecurity</code></td><td>Element</td><td align="center">0..1</td><td>Contains <code>3DS</code> (Three Domain Security) transaction details.</td></tr><tr><td><code>Results</code></td><td>Element</td><td align="center">1</td><td>Transaction results.<br><em><strong>IMPORTANT NOTE:</strong></em> <em><code>SCA / 3DS</code> details will only be provided if received from an <code>SCA / 3DS</code> compatible booking agent.</em></td></tr><tr><td><code>@ThreeDSVersion</code></td><td>String</td><td align="center">1</td><td><code>3DS</code> version used for authentication.</td></tr><tr><td><code>@XID</code></td><td>String</td><td align="center">0..1</td><td><p>Transaction identifier resulting from authentication processing.</p><p>When <code>ThreeDSVersion</code> = 1.x.x the transaction identifier MUST be provided in the <code>@XID</code> attribute.</p></td></tr><tr><td><code>@DSTransactionID</code></td><td>String</td><td align="center">0..1</td><td><p>Unique transaction identifier assigned by the Directory Server (DS) to identify a single transaction.</p><p>When <code>ThreeDSVersion</code> = 2.x.x the transaction identifier MUST be provided in the <code>@DSTransactionID</code> attribute.</p></td></tr><tr><td><code>@CAVV</code></td><td>String</td><td align="center">0..1</td><td>Cardholder Authentication Verification Value (CAVV); Authentication Verification Value (AVV); Universal Cardholder Authentication Field (UCAF)</td></tr><tr><td><code>@ECI</code></td><td>String</td><td align="center">1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#electronic-commerce-indicator">Electronic Commerce Indicator</a>.</td></tr><tr><td><code>@PAResStatus</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transactions-status-result-identifier">Transactions Status Result Identifier</a>.</td></tr><tr><td><code>@SignatureVerification</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transaction-signature-status">Transaction Signature Status</a>.</td></tr><tr><td><code>@Enrolled</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#status-of-authentication">Status of Authentication</a>.</td></tr><tr><td><code>Comments</code></td><td>Element</td><td align="center">0..1</td><td>The actual information related to the payment.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1..3</td><td>Holds the actual comment.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">1</td><td><p>Current supported names:</p><p><code>PaymentGatewayName</code>: The name of the payment gateway<br><code>PaymentGatewayAuthCode</code>: The authorization code of the payment gateway<br><code>PaymentReferenceId</code>: If a reference was provided for any payment</p></td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>Information related to the payment.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr><tr><td><code>GuaranteeDescription</code></td><td>Element</td><td align="center">0..1</td><td>Information about the form of guarantee.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>Information related to the guarantee.</p><p><strong>PCI sensitive data is prohibited.</strong></p></td></tr></tbody></table>

### **DepositPayments**

{% tabs %}
{% tab title="Deposit Only" %}

```xml
<DepositPayments>
    <GuaranteePayment>
        <AmountPercent Amount="30.00" CurrencyCode="USD" Percent="20.00"/>
        <Description>
            <Text>20% Deposit</Text>
        </Description>
    </GuaranteePayment>
</DepositPayments>			
```

{% endtab %}

{% tab title="Credit Card + Deposit" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted>
            <PaymentCard CardCode="VI" CardType="1" CardNumber="4444444444444444" ExpireDate="1114">
                <CardHolderName>Bruce Wayne</CardHolderName>
            </PaymentCard>
        </GuaranteeAccepted>
    </GuaranteesAccepted>
</Guarantee>
<DepositPayments>
    <GuaranteePayment>
        <AmountPercent Amount="30.00" CurrencyCode="USD" Percent="20.00"/>
        <Description>
            <Text>20% Deposit</Text>
        </Description>
    </GuaranteePayment>
</DepositPayments>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="270">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>DepositPayments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Deposit provided with the reservation.</td></tr><tr><td><code>GuaranteePayment</code></td><td>Element</td><td align="center">1</td><td>Contains details of the payment guarantee for the reservation.</td></tr><tr><td><code>AmountPercent</code></td><td>Element</td><td align="center">1</td><td>Represents the percentage of the total charge allocated for the deposit, rounded to two decimal places.<br>If <code>Total/AmountAfterTax</code> is provided, the percentage will be based on that value. Otherwise, if only <code>Total/AmountBeforeTax</code> is provided, the percentage will be calculated based on that value.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>A monetary amount taken for the deposit.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>The percentage used to calculate the amount.</td></tr><tr><td><code>@TaxInclusive</code></td><td></td><td align="center">0..1</td><td>Indicates if tax is included in <code>@Amount</code></td></tr><tr><td><code>Description</code></td><td>Element</td><td align="center">0..1</td><td>Contained of the deposit description <code>Text</code>.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description.</td></tr></tbody></table>

### Customer / Corporate / TravelAgent

{% tabs %}
{% tab title="Customer" %}
**Customer:** The individual who made the booking and serves as the primary contact for the reservation. This may or may not be the same person as the guest staying in the room.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
    <ProfileInfo>
        <UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/>
        <Profile ProfileType="1" ShareAllMarketInd="true">
            <Customer>
                <Document DocID="P123456" DocType="18" Gender="unknown" BirthDate="1920-02-29" BirthCountry="US" BirthPlace="Sydney" DocHolderNationality="AU" DocIssueAuthority="ImmigionNNNNNNNN" DocIssueCountry="AU" DocIssueLocation="Sydney" DocIssueStateProvince="QLD" EffectiveDate="2020-01-01" ExpireDate="2025-01-01">
                    <DocumentHolderName>James Herbert</DocumentHolderName>
                </Document>
                <PersonName>
                    <NamePrefix>Mr</NamePrefix>
                    <GivenName>James</GivenName>
                    <MiddleName>Herbert</MiddleName>
                    <Surname>Bond</Surname>
                </PersonName>
                <Telephone PhoneNumber="555-1234"/>
                <Telephone PhoneNumber="555-4321" PhoneUseType="4"/>
                <Telephone PhoneNumber="0411444000" PhoneTechType="5"/>
                <Telephone PhoneNumber="213451515" PhoneTechType="3"/>
                <Email>james.bond@mi5.co.uk</Email>
                <Address>
                    <AddressLine>Claretta House</AddressLine>
                    <AddressLine>Tower Bridge Close</AddressLine>
                    <CityName>London</CityName>
                    <PostalCode>EC1 2PG</PostalCode>
                    <StateProv>Middlesex</StateProv>
                    <CountryName>United Kingdom</CountryName>
                    <CompanyName>MI6</CompanyName>
                </Address>
                <CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2017-03-31"/>
            </Customer>
        </Profile>
    </ProfileInfo>
    <!-- Additional ProfileInfo elements -->
</Profiles>    
```

{% endcode %}
{% endtab %}

{% tab title="Corporate" %}
**Corporate:** The company or organisation associated with the booking, typically where a negotiated corporate rate applies or the reservation is billed to a company account.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
    <ProfileInfo>
        <Profile ProfileType="1">
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </Profile>
    </ProfileInfo>
    <!-- Additional ProfileInfo element -->                    
    <ProfileInfo>
        <UniqueID Type="16" ID="4444" ID_Context="IATA"/>
        <Profile ProfileType="3">
            <Customer>
                <PersonName>
                    <NamePrefix>Joe</NamePrefix>
                    <Surname>Smith</Surname>
                </PersonName>
                <Telephone PhoneNumber="555-1234"/>
                <Address>
                <CompanyName>American Express</CompanyName>
                </Address>
        </Customer>
    </Profile>
</ProfileInfo>
</Profiles>
```

{% endcode %}
{% endtab %}

{% tab title="Travel Agent" %}
**Travel Agent:** The agency or intermediary that sourced the booking on behalf of the customer, typically identified by an IATA or ARC number for commission reconciliation purposes.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
    <ProfileInfo>
        <Profile ProfileType="1">
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </Profile>
    </ProfileInfo>
    <!-- Additional ProfileInfo element -->                    
    <ProfileInfo>
        <UniqueID Type="16" ID="STA" ID_Context="CHANNEL"/>
        <UniqueID Type="16" ID="12312414" ID_Context="IATA"/>
        <Profile ProfileType="4">
            <Customer>
                <PersonName>
                    <NamePrefix>Mis</NamePrefix>
                    <Surname>Moneypenny</Surname>
                </PersonName>
                <Telephone PhoneNumber="555-1234"/>
                <Address>
                <CompanyName>STA Travel</CompanyName>
                </Address>
        </Customer>
    </Profile>
</ProfileInfo>
</Profiles>
```

{% endcode %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="260">Element / @Attribute</th><th width="112">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Profiles</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the profile information.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td align="center">1..3</td><td>Contains the profiles.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">0..n</td><td>Contains profile ids provided by the source channel. Available for <code>ProfileType 3</code> (Corporate) and <code>ProfileType 4</code> (Travel Agent)</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>16</code></td></tr><tr><td><code>@ID</code></td><td></td><td align="center">1</td><td>The reference identifier for the profile as provided by the source channel</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">1</td><td><code>CHANNEL</code> To specify that this is a channel reference id<br><code>IATA</code> To specify that this is an IATA identifier for a travel agent</td></tr><tr><td><code>Profile</code></td><td>Element</td><td align="center">1</td><td>Contains detailed customer profile information.</td></tr><tr><td><code>@ProfileType</code></td><td>Integer</td><td align="center">1</td><td><p>Defines the type of profile:</p><p><code>1</code> - Customer <strong>(mandatory)</strong><br><code>2</code> - GDS (optional)</p><p><code>3</code> - Corporate (optional)</p><p><code>4</code> - Travel Agent (optional)<br><code>5</code> - Wholesaler (optional)<br><code>21</code> - Arranger (optional)</p></td></tr><tr><td><code>@ShareAllMarketInd</code></td><td>Boolean</td><td align="center">0..1</td><td>Customer has 'opted in' to receive marking information (EU Customers).</td></tr><tr><td><code>@ShareAllOptOutInd</code></td><td>Boolean</td><td align="center">0..1</td><td>Customer has 'opted out' of receiving marking information (Non EU).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td align="center">1</td><td>Contains detailed guest information.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">1</td><td>Contains the name information for the guest.</td></tr><tr><td><code>NamePrefix</code></td><td>Element</td><td align="center">0..1</td><td>Title of the guest.</td></tr><tr><td><code>GivenName</code></td><td>Element</td><td align="center">1</td><td>First name of the guest.</td></tr><tr><td><code>MiddleName</code></td><td>Element</td><td align="center">0..1</td><td>Middle name of the guest.</td></tr><tr><td><code>Surname</code></td><td>Element</td><td align="center">1</td><td>Last name of the guest.</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..4</td><td>Contains telephone information related to the guest.</td></tr><tr><td><code>@PhoneNumber</code></td><td>String</td><td align="center">1</td><td>Contains the actual number (maximum 32 characters).</td></tr><tr><td><code>@PhoneUseType</code></td><td>Integer</td><td align="center">0..1</td><td>The type of phone use for example daytime, nighttime, work. If this field is blank this is the primary phone, otherwise PhoneUseType="4" denotes a secondary or nighttime phone.</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td align="center">0..1</td><td><p>The type of phone technology. If not provided it should be assumed as a landline</p><p><code>5</code> - Mobile<br><code>3</code> - Fax</p></td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..1</td><td>Contact email address.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..1</td><td>Address information of the guest.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td align="center">0..n</td><td>Address lines for the guest.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td align="center">0..1</td><td>City of residence.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td align="center">0..1</td><td>Postal code.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td align="center">0..1</td><td>State or province name.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td align="center">0..1</td><td>Contains country information (maximum 64 characters). This is a free-text field, so a variety of formats may be received—for example: <em>Australia</em>, <em>AUS</em>, <em>AU</em>, etc.</td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">1</td><td>Name of the company. Used for <code>ProfileType 3</code> (Corporate) and <code>ProfileType 4</code> (Travel Agent) only. While can be received in <code>ProfileType 1</code> , it is not standard practice.</td></tr><tr><td><code>CustLoyalty</code></td><td>Element</td><td align="center">0..1</td><td>Contains loyalty information for the customer.</td></tr><tr><td><code>@ProgramID</code></td><td>String</td><td align="center">0..1</td><td>Defined membership program name or ID applicable to the program.</td></tr><tr><td><code>@MembershipID</code></td><td>String</td><td align="center">0..1</td><td>Account identification number for this particular member in this particular program.</td></tr><tr><td><code>@ExpiryDate</code></td><td>Date</td><td align="center">0..1</td><td>Expiry date for this particular membership record in this particular program.</td></tr><tr><td><code>Document</code></td><td>Element</td><td align="center">0..1</td><td>Detailed document information for the guest.</td></tr><tr><td><code>@BirthCountry</code></td><td>String</td><td align="center">0..1</td><td>Birth country of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@BirthDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the date of birth as indicated in the document. Use <code>ISO 8601</code> date format.</td></tr><tr><td><code>@BirthPlace</code></td><td>String</td><td align="center">0..1</td><td>Specifies the birth place of the document holder (e.g., city, state, county, province).</td></tr><tr><td><code>@DocHolderNationality</code></td><td>String</td><td align="center">0..1</td><td>Country of nationality of the document holder. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocID</code></td><td>String</td><td align="center">1</td><td>Unique number assigned by authorities to the document.</td></tr><tr><td><code>@DocIssueAuthority</code></td><td>String</td><td align="center">0..1</td><td>Indicates the group or association that granted the document.</td></tr><tr><td><code>@DocIssueCountry</code></td><td>String</td><td align="center">0..1</td><td>Country where the document was issued. Use <code>ISO 3166</code> A-2 country codes.</td></tr><tr><td><code>@DocIssueLocation</code></td><td>String</td><td align="center">0..1</td><td>Indicates the location where the document was issued.</td></tr><tr><td><code>@DocIssueStateProv</code></td><td>String</td><td align="center">0..1</td><td>State or Province where the document was issued.</td></tr><tr><td><code>@DocType</code></td><td>String</td><td align="center">1</td><td>Indicates the type of document. Refer to <a href="/pages/mZ5VhSA8q98aQtJqawjh">Document Type Code (DOC)</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the ending date.</td></tr><tr><td><code>@Gender</code></td><td>String</td><td align="center">0..1</td><td><p>Identifies the gender:</p><p><code>Female</code></p><p><code>Male</code></p><p><code>Unknown</code></p></td></tr><tr><td><code>DocumentHolderName</code></td><td>Element</td><td align="center">0..1</td><td>The name of the document holder in unformatted text (Mr. Sam Jones). If no <code>DocumentHolderName</code> is included, the guest name fields will be assumed as the holder name.</td></tr></tbody></table>

### **BasicPropertyInfo**

```xml
<BasicPropertyInfo HotelCode="HOTELCODE" HotelName="The Hotel Name"/>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>BasicPropertyInfo</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains basic identification details for the hotel associated with the reservation.<br><code>BasicPropertyInfo</code> will always be sent as either part of the <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">RoomStay</a> or <a href="https://github.com/siteminder-au/gitbook/blob/master/sm-published-apis/.gitbook/includes/broken-reference/README.md">ResGlobalInfo</a>, depending on your setup in SiteMinder. We recommend receiving the <code>BasicPropertyInfo</code> as part of the <code>ResGlobalInfo</code> due to how Booking.com cancellation messages are sent.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>@HotelName</code></td><td>String</td><td align="center">0..1</td><td>Name of the hotel.</td></tr></tbody></table>

## 3. Confirmation Request

Using `OTA_NotifReportRQ` the PMS sends a confirmation message to SiteMinder for the delivery of reservations, modifications, or cancellations. If not confirmed, the information will be resent in response to the `OTA_ReadRQ` message. Confirmation of delivery does not guarantee that the reservation was successfully created in the PMS. The `OTA_NotifReportRQ` message can be used to confirm any erroneous deliveries.

The structure of the `OTA_NotifReportRQ` does not permit a mix of successfully processed and erroneous reservations in the same message. Successfully processed reservations must be confirmed in separate `OTA_NotifReportRQ` messages from those that could not be processed.

{% hint style="warning" %}
SiteMinder will automatically mark a reservation as 'Error' (fail) under the following conditions:

* **20 Delivery Attempts:** The reservation has been requested (`OTA_ReadRQ`) at least 20 times without receiving a valid `OTA_NotifReportRQ`.
* **14-Day Timeout:** No delivery attempts have been made for 14 days.
* **1-Hour Timeout:** At least one delivery attempt has been made, and it has been 1 hour since the first attempt.

**Important:** This mechanism is a fail-safe feature; we expect to receive either a 'Success' or 'Error' `OTA_NotifReportRQ`. It should not be relied upon for handling reservations that cannot be processed.
{% endhint %}

{% tabs %}
{% tab title="Confirm Reservation" %}

* The presence of the `<Success/>` element indicates that the reservation was created in the PMS.
* The UniqueID Type 16 element informs SiteMinder which reservation message is being confirmed.
* The `HotelReservationID` holds the ID of the newly created reservation in the PMS.

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security soap:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_NotifReportRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:50+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Success/>
			<NotifDetails>
				<HotelNotifReport>
					<HotelReservations>
						<HotelReservation CreateDateTime="2025-08-20T09:28:47+02:00" ResStatus="Book">
							<UniqueID Type="16" ID="qlmumfgwx85nlkgmtb"/>
							<ResGlobalInfo>
								<HotelReservationIDs>
									<HotelReservationID ResID_Type="14" ResID_Value="ABC-1234567890"/>
								</HotelReservationIDs>
							</ResGlobalInfo>
						</HotelReservation>
					</HotelReservations>
				</HotelNotifReport>
			</NotifDetails>
		</OTA_NotifReportRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirm Modification" %}

* The presence of the `<Success/>` element indicates that the modification was processed in the PMS.
* The UniqueID Type 16 element informs SiteMinder which modification message is being confirmed.
* The `HotelReservationID` holds the ID of the reservation modified in the PMS.

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security soap:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_NotifReportRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:50+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Success/>
			<NotifDetails>
				<HotelNotifReport>
					<HotelReservations>
						<HotelReservation LastModifyDateTime="2025-08-20T09:44:47+02:00" ResStatus="Modify">
							<UniqueID Type="16" ID="bxlumfgwx85nlkgmtc"/>
							<ResGlobalInfo>
								<HotelReservationIDs>
									<HotelReservationID ResID_Type="14" ResID_Value="ABC-1234567890"/>
								</HotelReservationIDs>
							</ResGlobalInfo>
						</HotelReservation>
					</HotelReservations>
				</HotelNotifReport>
			</NotifDetails>
		</OTA_NotifReportRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirm Cancellation" %}

* The presence of the `<Success/>` element indicates that the cancellation was processed in the PMS.
* The UniqueID Type 16 element informs SiteMinder which cancellation message is being confirmed.
* The `HotelReservationID` holds the ID of the reservation cancelled in the PMS.

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security soap:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_NotifReportRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:50+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Success/>
			<NotifDetails>
				<HotelNotifReport>
					<HotelReservations>
						<HotelReservation LastModifyDateTime="2025-08-20T11:44:47+02:00" ResStatus="Cancel">
							<UniqueID Type="16" ID="bxlumfgwx85nlkgmtc"/>
							<ResGlobalInfo>
								<HotelReservationIDs>
									<HotelReservationID ResID_Type="14" ResID_Value="ABC-1234567890"/>
								</HotelReservationIDs>
							</ResGlobalInfo>
						</HotelReservation>
					</HotelReservations>
				</HotelNotifReport>
			</NotifDetails>
		</OTA_NotifReportRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Confirm Multiple Reservations" %}

* The presence of the `<Success/>` element indicates that the reservations were created in the PMS.
* The UniqueID Type 16 element informs SiteMinder which reservation message is being confirmed.
* The `HotelReservationID` holds the ID of the newly created reservation in the PMS.

{% hint style="warning" %}
It is not necessary for all reservations retrieved in a single ReadRQ to be confirmed in one `OTA_NotifReportRQ` message. If it’s more convenient for the PMS to send one `OTA_NotifReportRQ` for each reservation, that approach is perfectly acceptable.
{% endhint %}

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security soap:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_NotifReportRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:50+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Success/>
			<NotifDetails>
				<HotelNotifReport>
					<HotelReservations>
						<HotelReservation CreateDateTime="2025-11-30T14:37:11-03:00" ResStatus="Book">
							<UniqueID Type="16" ID="qlmumfgwx85nlkgmtb"/>
							<ResGlobalInfo>
								<HotelReservationIDs>
									<HotelReservationID ResID_Type="14" ResID_Value="ABC-1234567890"/>
								</HotelReservationIDs>
							</ResGlobalInfo>
						</HotelReservation>
						<HotelReservation CreateDateTime="2025-11-30T14:37:17-03:00" ResStatus="Book">
							<UniqueID Type="16" ID="2frbvhw0e6ho89mkkq"/>
							<ResGlobalInfo>
								<HotelReservationIDs>
									<HotelReservationID ResID_Type="14" ResID_Value="CBA-0987654321"/>
								</HotelReservationIDs>
							</ResGlobalInfo>
						</HotelReservation>
					</HotelReservations>
				</HotelNotifReport>
			</NotifDetails>
		</OTA_NotifReportRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirm with Errors" %}

* The presence of the `<Error/>` element indicates that the reservation was **not created** in the PMS. The element's **text content must be present** and provide a meaningful and human-readable description of the error (e.g. Invalid room type).
* The UniqueID Type 16 element informs SiteMinder which reservation is being confirmed.
* **No** **`HotelReservationID`** is present if the PMS was unable to save the reservation.

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security soap:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_NotifReportRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:50+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Errors>
				<Error Type="3" Code="402">Invalid room type</Error>
			</Errors>
			<NotifDetails>
				<HotelNotifReport>
					<HotelReservations>
						<HotelReservation CreateDateTime="2025-08-20T09:28:00+02:00" ResStatus="Book">
							<UniqueID Type="16" ID="txlugfiwx85nlkgmtb"/>
						</HotelReservation>
					</HotelReservations>
				</HotelNotifReport>
			</NotifDetails>
		</OTA_NotifReportRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="129">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>OTA_NotifReportRQ</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated. TimeStamp must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Either <code>Success</code> or <code>Error</code> element present.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Contains a list of errors if the reservation, modification or cancellation failed to process</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Should be at least one node if there is an Errors node. Must include a free-text, meaningful, human-readable description of the error.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-warning-types">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-codes">Error Codes (ERR)</a>.</td></tr><tr><td><code>NotifDetails / HotelNotifReport</code></td><td>Element</td><td align="center">1</td><td></td></tr><tr><td><code>HotelReservations / HotelReservation</code></td><td>Element</td><td align="center">1..n</td><td>One for each reservation being confirmed.</td></tr><tr><td><code>@CreateDateTime</code></td><td>dateTime</td><td align="center">0..1</td><td>The time the reservation was created in the PMS.<br><strong>Mandatory if <code>ResStatus</code> is <code>Book</code>.</strong></td></tr><tr><td><code>@LastModifyDateTime</code></td><td>dateTime</td><td align="center">0..1</td><td>The time the reservation was updated in the PMS.<br><strong>Mandatory if <code>ResStatus</code> is <code>Modify</code> or <code>Cancel</code>.</strong></td></tr><tr><td><code>@ResStatus</code></td><td>String</td><td align="center">0..1</td><td><p>Specifies the booking status:</p><p><code>Book</code></p><p><code>Modify</code></p><p><code>Cancel</code></p></td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">1</td><td>The identifier of the reservation message as known to SiteMinder.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>16</code></td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>UniqueID of Type 16 from the OTA_ResRetrieveRS</td></tr><tr><td><code>ResGlobalInfo</code></td><td>Element</td><td align="center">0..1</td><td><strong>Mandatory</strong> if the reservation is part of a successful delivery batch.</td></tr><tr><td><code>HotelReservationIDs / HotelReservationID</code></td><td>Element</td><td align="center">1</td><td>PMS reservation identifier.</td></tr><tr><td><code>@ResID_Type</code></td><td>Integer</td><td align="center">1</td><td>Always <code>14</code></td></tr><tr><td><code>@ResID_Value</code></td><td>String</td><td align="center">1</td><td>The identifier of the reservation created by the PMS. This is the reservation ID in the PMS.</td></tr></tbody></table>

## 4. **Receipt Response**

The `OTA_NotifReportRS` message is sent to the PMS as a response to the `OTA_NotifReportRQ` message, confirming that SiteMinder successfully processed the request.

{% tabs %}
{% tab title="Success Response" %}

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_NotifReportRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:57+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Success/>
		</OTA_NotifReportRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Error Response" %}

```xml
<SOAP-ENV:Envelope
	xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_NotifReportRS
			xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:57+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677">
			<Errors>
				<Error Type="3" Code="385">Could not find Notifications to confirm with notification id='3123456'</Error>
			</Errors>
		</OTA_NotifReportRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Reservation XML Samples

<details>

<summary>Maximum Content XML</summary>

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><OTA_ResRetrieveRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:45+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c"><Success/><ReservationsList><HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book"><POS><Source><RequestorID Type="22" ID="SITEMINDER"/><BookingChannel Primary="true" Type="7"><CompanyName Code="EXP">Expedia</CompanyName></BookingChannel></Source><Source><BookingChannel Primary="false" Type="7"><CompanyName Code="EXPA">Expedia Affilate Account</CompanyName></BookingChannel></Source></POS><UniqueID Type="14" ID="ABC-1234567890"/><UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/><RoomStays><RoomStay MarketCode="Corporate" PromotionCode="STAYANDSAVE" SourceOfBusiness="Radio"><RoomTypes><RoomType RoomType="Double Room" RoomTypeCode="DR" NonSmoking="true" Configuration="2 Beds and 1 cot"><RoomDescription><Text>Double room</Text></RoomDescription><AdditionalDetails><AdditionalDetail Type="4" Code="PIA"><DetailDescription><Text>Room paid in advance with credit card</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="7"><DetailDescription><Text>Cancellation deadline 10/10/2012</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="5" Code="ECB"><DetailDescription><Text>Continental breakfast included</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RoomType></RoomTypes><RatePlans><RatePlan RatePlanCode="RAC1" EffectiveDate="2013-03-12" ExpireDate="2013-03-14" RatePlanName="RACK Rate1"><RatePlanDescription><Text>Long Stay Discount</Text></RatePlanDescription><AdditionalDetails><AdditionalDetail Type="15" Code="EB1"><DetailDescription><Text>Stay n Save promotion grants 10% discount</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="43"><DetailDescription><Text>Continental breakfast included</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="5" Code="ECB"><DetailDescription><Text>Expedia Collect</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RatePlan><RatePlan RatePlanCode="RAC2" EffectiveDate="2013-03-14" ExpireDate="2013-03-15" RatePlanName="RACK Rate2"><RatePlanDescription><Text>Discounted Daily Rate</Text></RatePlanDescription><AdditionalDetails><AdditionalDetail Type="15" Code="EB1"><DetailDescription><Text>Single Night Discount Promo</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="43"><DetailDescription><Text>Continental breakfast included</Text></DetailDescription></AdditionalDetail><AdditionalDetail Type="5" Code="ECB"><DetailDescription><Text>Expedia Collect</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RatePlan></RatePlans><RoomRates><RoomRate RoomTypeCode="DR" RatePlanCode="RAC1" NumberOfUnits="1"><Rates><Rate UnitMultiplier="2" RateTimeUnit="Day" EffectiveDate="2013-03-12" ExpireDate="2013-03-14"><Base AmountBeforeTax="200.00" AmountAfterTax="220.00" CurrencyCode="USD"><Taxes Amount="20.00"><Tax Code="19" Percent="10" Amount="20.00"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="202.50" AmountAfterTax="222.75" CurrencyCode="USD"><Taxes Amount="20.25"><Tax Code="19" Percent="10" Amount="20.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total></Rate></Rates><ServiceRPHs><ServiceRPH RPH="1"/></ServiceRPHs></RoomRate><RoomRate RoomTypeCode="DR" RatePlanCode="RAC2" NumberOfUnits="1"><Rates><Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2013-03-14" ExpireDate="2013-03-15"><Base AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="USD"><Taxes Amount="10.00"><Tax Code="19" Percent="10" Amount="10.00"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="102.50" AmountAfterTax="112.75" CurrencyCode="USD"><Taxes Amount="10.25"><Tax Code="19" Percent="10" Amount="10.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total></Rate></Rates><ServiceRPHs><ServiceRPH RPH="2"/></ServiceRPHs></RoomRate></RoomRates><ServiceRPHs><ServiceRPH RPH="3"/></ServiceRPHs><GuestCounts><GuestCount AgeQualifyingCode="10" Count="1"/><GuestCount AgeQualifyingCode="8" Count="1"/><GuestCount AgeQualifyingCode="7" Count="1"/></GuestCounts><TimeSpan Start="2013-03-12" End="2013-03-15"/><Total AmountAfterTax="568.25" CurrencyCode="USD"/><BasicPropertyInfo HotelCode="HOTELCODE"/><ResGuestRPHs><ResGuestRPH RPH="1"/></ResGuestRPHs><Comments><Comment><Text>non-smoking Room requested, king bed</Text></Comment></Comments></RoomStay></RoomStays><Services><Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="1" Quantity="1" ID="12345" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="USD"><Taxes Amount="0.25"><Tax Code="19" Percent="10" Amount="0.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="5.00" AmountAfterTax="5.50" CurrencyCode="USD"><Taxes Amount="0.50"><Tax Code="19" Percent="10" Amount="0.50"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Extra person charge $2.50 (ex GST) per day for cot</Text></RateDescription></Price><ServiceDetails><TimeSpan End="2013-03-14" Start="2013-03-12"/></ServiceDetails></Service><Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="2" Quantity="1" ID="12346" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="USD"><Taxes Amount="0.25"><Tax Code="19" Percent="10" Amount="0.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="USD"><Taxes Amount="0.25"><Tax Code="19" Percent="10" Amount="0.25"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Extra person charge $2.50 (ex GST) per day for cot</Text></RateDescription></Price><ServiceDetails><TimeSpan End="2013-03-15" Start="2013-03-14"/></ServiceDetails></Service><Service ServiceInventoryCode="OTHER" Inclusive="true" ServiceRPH="3" Quantity="2" ID="12347" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="4.55" AmountAfterTax="5.00" CurrencyCode="USD"><Taxes Amount="0.45"><Tax Code="19" Percent="10" Amount="0.45"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="9.09" AmountAfterTax="10.00" CurrencyCode="USD"><Taxes Amount="0.91"><Tax Code="19" Percent="10" Amount="0.91"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Extra bathrobe $5.00 (incl GST) per person</Text></RateDescription></Price></Service><Service ServiceInventoryCode="EXTRA" Inclusive="true" Quantity="1" ID="12348" ID_Context="CHANNEL" Type="18"><Price><Base AmountBeforeTax="4.55" AmountAfterTax="5.00" CurrencyCode="USD"><Taxes Amount="0.45"><Tax Code="19" Percent="10" Amount="0.45"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="13.65" AmountAfterTax="15.00" CurrencyCode="USD"><Taxes Amount="1.35"><Tax Code="19" Percent="10" Amount="1.35"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><RateDescription><Text>Car Park - Undercover Parking (Clearance 2.2 meter or 7.2 feet) $5.00 (incl GST) per day</Text></RateDescription></Price><ServiceDetails><TimeSpan End="2013-03-15" Start="2013-03-12"/></ServiceDetails></Service></Services><ResGuests><ResGuest ResGuestRPH="1" ArrivalTime="10:30:00" Age="8" PrimaryIndicator="true"><Profiles><ProfileInfo><UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/><Profile ProfileType="1"><Customer><PersonName><NamePrefix>Mr</NamePrefix><GivenName>James</GivenName><MiddleName>Herbert</MiddleName><Surname>Bond</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Telephone PhoneNumber="555-4321" PhoneUseType="4"/><Telephone PhoneNumber="0411444000" PhoneTechType="5"/><Telephone PhoneNumber="213451515" PhoneTechType="3"/><Email>james.bond@mi5.co.uk</Email><Address><AddressLine>Claretta House</AddressLine><AddressLine>Tower Bridge Close</AddressLine><CityName>London</CityName><PostalCode>EC1 2PG</PostalCode><StateProv>Middlesex</StateProv><CountryName>United Kingdom</CountryName></Address><CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2017-03-31"/></Customer></Profile></ProfileInfo></Profiles><Comments><Comment Name="ArrivalDetails"><Text>Arriving by coach</Text></Comment><Comment Name="DepartureDetails"><Text>Departure flight QF123</Text></Comment></Comments></ResGuest></ResGuests><ResGlobalInfo><Guarantee><GuaranteesAccepted><GuaranteeAccepted><PaymentCard CardCode="VI" CardType="1" CardNumber="4444444444444444" ExpireDate="1114"><CardHolderName>John Smith</CardHolderName></PaymentCard></GuaranteeAccepted></GuaranteesAccepted><Comments><Comment Name="PaymentReferenceId"><Text>123124151616</Text></Comment></Comments><GuaranteeDescription><Text>Payment accepted up front</Text></GuaranteeDescription></Guarantee><DepositPayments><GuaranteePayment><AmountPercent Amount="291.63" Percent="50" CurrencyCode="USD"/><Description><Text>50% Deposit</Text></Description></GuaranteePayment></DepositPayments><Fees><Fee TaxInclusive="true" Type="Inclusive" Code="27" Amount="5.00"><Taxes Amount="0.45"/><Description Name="Commission"><Text>Commission - $5 flat fee</Text></Description></Fee></Fees><Total AmountAfterTax="583.25" CurrencyCode="USD"><Taxes Amount="53.01"><Tax Code="19" Percent="10" Amount="53.01"><TaxDescription><Text>GST 10 percent</Text></TaxDescription></Tax></Taxes></Total><HotelReservationIDs><HotelReservationID ResID_Type="14" ResID_Value="1234567890"/></HotelReservationIDs><Profiles><ProfileInfo><UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/><Profile ProfileType="1"><Customer><PersonName><NamePrefix>Mr</NamePrefix><GivenName>James</GivenName><MiddleName>Herbert</MiddleName><Surname>Bond</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Telephone PhoneNumber="555-4321" PhoneUseType="4"/><Telephone PhoneNumber="0411444000" PhoneTechType="5"/><Telephone PhoneNumber="213451515" PhoneTechType="3"/><Email>james.bond@mi5.co.uk</Email><Address><AddressLine>Claretta House</AddressLine><AddressLine>Tower Bridge Close</AddressLine><CityName>London</CityName><PostalCode>EC1 2PG</PostalCode><StateProv>Middlesex</StateProv><CountryName>United Kingdom</CountryName><CompanyName>MI6</CompanyName></Address><CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2017-03-31"/></Customer></Profile></ProfileInfo><ProfileInfo><UniqueID Type="16" ID="4444" ID_Context="IATA"/><Profile ProfileType="3"><Customer><PersonName><NamePrefix>Joe</NamePrefix><Surname>Smith</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Address><CompanyName>American Express</CompanyName></Address></Customer></Profile></ProfileInfo><ProfileInfo><UniqueID Type="16" ID="STA" ID_Context="CHANNEL"/><UniqueID Type="16" ID="12312414" ID_Context="IATA"/><Profile ProfileType="4"><Customer><PersonName><NamePrefix>Mis</NamePrefix><Surname>Moneypenny</Surname></PersonName><Telephone PhoneNumber="555-1234"/><Address><CompanyName>STA Travel</CompanyName></Address></Customer></Profile></ProfileInfo></Profiles><Comments><Comment><Text>will be arriving after 6 pm</Text></Comment></Comments><BasicPropertyInfo HotelCode="10107"/></ResGlobalInfo></HotelReservation></ReservationsList></OTA_ResRetrieveRS></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

</details>

<details>

<summary>Minimum Content XML</summary>

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><OTA_ResRetrieveRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" TimeStamp="2024-07-06T15:27:45+00:00" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c"><Success/><ReservationsList><HotelReservation CreateDateTime="2024-07-06T15:23:35+00:00" ResStatus="Book"><POS><Source><RequestorID Type="22" ID="SITEMINDER"/><BookingChannel Primary="true" Type="7"><CompanyName Code="EXP">Expedia</CompanyName></BookingChannel></Source><Source><BookingChannel Primary="false" Type="7"><CompanyName Code="EXPA">Expedia Affilate Account</CompanyName></BookingChannel></Source></POS><UniqueID Type="14" ID="ABC-1234567890"/><UniqueID Type="16" ID="isuokfr1pyc2ntest7" ID_Context="MESSAGE_UNIQUE_ID"/><RoomStays><RoomStay><RoomTypes><RoomType RoomTypeCode="DR"/></RoomTypes><RatePlans><RatePlan RatePlanCode="RAC" EffectiveDate="2027-03-12" ExpireDate="2027-03-15"/></RatePlans><RoomRates><RoomRate RoomTypeCode="DR" RatePlanCode="RAC" NumberOfUnits="1"><Rates><Rate UnitMultiplier="3" RateTimeUnit="Day" EffectiveDate="2027-03-12" ExpireDate="2027-03-15"/></Rates></RoomRate></RoomRates><GuestCounts><GuestCount AgeQualifyingCode="10" Count="1"/></GuestCounts><TimeSpan Start="2027-03-12" End="2027-03-15"/><BasicPropertyInfo HotelCode="HOTELCODE"/></RoomStay></RoomStays><ResGuests><ResGuest><Profiles><ProfileInfo><Profile ProfileType="1"><Customer><PersonName><GivenName>James</GivenName><Surname>Bond</Surname></PersonName></Customer></Profile></ProfileInfo></Profiles></ResGuest></ResGuests><ResGlobalInfo><HotelReservationIDs><HotelReservationID ResID_Type="14" ResID_Value="1234567890"/></HotelReservationIDs><BasicPropertyInfo HotelCode="HOTELCODE"/></ResGlobalInfo></HotelReservation></OTA_ResRetrieveRS></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

</details>

## Common Questions

<details>

<summary>What happens if reservations fail to be delivered to my PMS?</summary>

SiteMinder times out the reservation after repeated failures.

The hotel receives an email advising them to contact their PMS provider. Always send delivery confirmation to prevent timeouts and ensure reservations are tracked.

</details>

<details>

<summary>Do I always receive both Before and After Tax amounts?</summary>

No. You receive whichever amounts the channel provides.

Some channels send both `AmountBeforeTax` and `AmountAfterTax`, others send only one. Your PMS must handle both scenarios.

</details>

<details>

<summary>Why don't the daily rates in reservations match the rates I sent?</summary>

There are three common scenarios:

**1. Channel Discounts or Promotions** The guest used a channel discount, so the final booked amount differs from your pushed rate.

**2. No Daily Rates Provided** Some channels only send the total stay cost. SiteMinder calculates daily rates by averaging the RoomStay Total across the number of nights.

**3. Missing Rates for Specific Dates** Channels may omit daily rates for certain dates (e.g., free night promotions). SiteMinder averages the RoomStay Total to determine daily rates.

</details>

<details>

<summary>Why is the reservation missing data that the property says was sent?</summary>

SiteMinder forwards all data received from booking channels without modification.

Missing data means the channel didn't provide it. The property must verify with the channel directly.

**Exception:** Credit card/document IDs may be disabled for PCI/PII compliance - contact Partner Integrations to enable.

</details>

<details>

<summary>What are the differences between Guests and Customers?</summary>

**Customer**: The contact person or individual who made the booking. Found in `ResGlobalInfo/Profile` with `Type="1"`.

**Guests**: The individuals who will check in and stay in the room. Found in `ResGuests/Profile`.

If the Customer is also staying in the room, they appear in both sections.

</details>

<details>

<summary>Why is <code>&#x3C;ResGuestRPHs></code> sometimes missing?</summary>

It's optional for single-guest reservations.

`<ResGuestRPHs>` links guests to room stays in multi-room/multi-guest bookings. For single-guest reservations, the association is implicit, so channels may omit this element.

</details>

<details>

<summary>Can I send multiple PMS reference IDs for reservations with multiple RoomStays?</summary>

No. Each UniqueID can only have one `ResID_Value` in SiteMinder.

If your PMS splits multi-RoomStay reservations into separate bookings, you cannot send multiple PMS reference IDs back in one reservation confirmation.

Channels rarely send multiple `RoomStays` with broken date ranges in one reservation. They typically create separate reservations, each with its own `UniqueID`, so each gets its own distinct `ResID_Value`.

</details>

<details>

<summary>Why do all extras get classified as "EXTRA"?</summary>

SiteMinder can only classify extras if the channel classifies them when sending the reservation.

Most channels (including Direct Booking test accounts) do not categorize extras according to the OTA standard, so they all appear as "EXTRA" by default.

Your PMS should handle extras with generic "EXTRA" classification as the most common scenario.

</details>

<details>

<summary>How do I identify which extras are booked for which room?</summary>

Match ServiceRPH values to link extras to rooms.

**Example:**

* `RoomStay/ServiceRPH@RPH="1"` → links to `Services/Service@ServiceRPH="1"`
* This associates that service with that specific RoomStay

</details>

<details>

<summary>Do you forward channel commissions?</summary>

Only if the channel provides commission details.

When commission information is available, SiteMinder includes it in the `Fees` section:

* Fixed commission amount in `Fee@Amount`
* Commission percentage in `Fee/Description`

Most channels do not provide commission data.

</details>

<details>

<summary>Do you support full credit card numbers?</summary>

Yes, when the channel provides them.

SiteMinder forwards full credit card numbers if provided by the channel. However, if a channel only provides partial information (typically 3-4 digits), you'll receive the partial card number in `PaymentCard@MaskedCardNumber`.

Hotels can obtain full card details from the channel's extranet or booking confirmation email if needed.

</details>

<details>

<summary>Can I receive the CVC/CVV code?</summary>

No. PCI regulations prohibit sending card number and CVC together.

Hotels can find CVC in:

* SiteMinder reservation confirmation emails (if enabled)
* Channel extranet

</details>

<details>

<summary>Do you support Virtual Credit Cards (VCC)?</summary>

Yes. Virtual credit cards are delivered as standard credit cards in the `PaymentCard` element.

There are no VCC-specific attributes - they use the same structure as regular credit cards (`CardNumber`, `CardCode`, `ExpireDate`, `CardHolderName`).

Your PMS processes VCCs the same way as standard credit cards.

</details>

<details>

<summary>Why am I not receiving credit card details or guest document IDs?</summary>

PCI/PII compliance restrictions prevent automatic delivery of sensitive data.

Contact Partner Integrations team to enable this data if your PMS is PCI compliant.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Upload (PMS -> SM)

Sync PMS reservations back to SiteMinder Platform.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Reservations Upload · **Direction:** PMS → SM · **Method:** Push
{% endhint %}

## What is Reservations Upload (PMS -> SM)? <a href="#what-is-reservations-push" id="what-is-reservations-push"></a>

**Reservations Upload (PMS -> SM)** is a delivery method where the Property Management System (PMS) actively pushes reservations, modifications, and cancellations to the SiteMinder Ecosystem. This includes all PMS reservations—walk-ins, historic OTA bookings, and direct bookings—which are sent to SiteMinder's web service endpoint in real-time.

{% hint style="warning" %}
To implement **Reservations Upload**, the PMS must certify for [Reservations PUSH](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations/reservations-push) or [Reservations PULL](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations/reservations-pull).
{% endhint %}

{% hint style="warning" %}
**Re-Certification required for PMS partners previously certified as SMX for PMS**

If your PMS was previously certified as SMX for PMS, you must re-certify against the specification documented on this page. Key changes include `RequestorID`, `POS/Source` structure, and `HotelReservationID` mappings.&#x20;
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>SiteMinder will provide a single global endpoint for all hotels for PMS to send push requests <code>OTA_HotelResNotifRQ</code> and receive confirmation responses <code>OTA_ResRetrieveRS</code>.</li><li><strong>Test Environment Endpoint:</strong> <a href="https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D">https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}</a></li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>SiteMinder will provide a single username/password for all hotels (PMS Level authentication).</li><li>PMS must include authentication credentials within the <strong>SOAP Security header</strong> of each <code>OTA_HotelResNotifRQ</code>.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses must be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li><li>SiteMinder sends requests over <strong>port 443</strong>.</li></ul></td></tr></tbody></table>

## Message Exchange Flow <a href="#message-exchange-flow" id="message-exchange-flow"></a>

When reservations are created, modified, or canceled outside of SiteMinder's distribution network, your PMS delivers them to the SiteMinder Platform using a synchronous SOAP/HTTPS exchange. This ensures SiteMinder maintains a complete view of property inventory across all booking sources.

1. **Reservation Message (PMS to SiteMinder):** `OTA_HotelResNotifRQ`\
   Delivers a single reservation message (new booking, modification, or cancellation).
2. **Confirmation Response (SiteMinder to PMS):** `OTA_HotelResNotifRS`\
   Confirms successful receipt or reports processing failure.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every reservation request from your PMS to SiteMinder endpoint. It contains the username and password credentials that we provide to the PMS during integration setup.

**Key Requirements:**

* **Validation**: Our endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Reservation Message" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRQ
			xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<HotelReservations>
				<HotelReservation ResStatus="Reserved" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-06T15:23:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
					<!-- ... other elements and attributes have been omitted for brevity ... -->
					<UniqueID ID="1234567890"/>
					<!-- ... other elements and attributes have been omitted for brevity ... -->
				</HotelReservation>
			</HotelReservations>
		</OTA_HotelResNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:29:41+00:00" Version="1.001" ResResponseType="Modified">
			<Success/>
			<HotelReservations>
				<HotelReservation>
					<UniqueID ID="123456789" Type="14" /> <!-- Reservation Id-->
					<UniqueID ID="74a63a92-d988-46b8-8476-3319285af8ac" Type="34" /> <!-- Payment Context ID -->
				</HotelReservation>
			</HotelReservations>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## 1. Reservation Message <a href="#id-1.-reservation-message-structure" id="id-1.-reservation-message-structure"></a>

### OTA\_HotelResNotifRQ <a href="#id-1.-reservation-message-structure" id="id-1.-reservation-message-structure"></a>

The `OTA_HotelResNotifRQ` message carries reservation data your PMS to SiteMinder. Each message contains exactly one reservation (new booking, modification, or cancellation).

The message consists of a list of `HotelReservation` elements. The content may vary since the PMS can delivers reservations from multiple upstream sources (walk-in reservations, direct booking channels, etc.), many of which have significantly different reservation formats and data structures.

#### **Reservation Types**

**PMS Reservation:** A reservation created directly at the hotel property. For example when a guest arrives without a prior booking, or a customer phones to make a booking. These originate in the PMS and represent the simplest reservation flow with no external channels involved.

**Internet :** A reservation from a booking platform or website that connects directly to the PMS, bypassing SiteMinder's distribution network. Examples include the hotel's own booking engine, direct OTA connections, or property-specific reservation tools.&#x20;

**Other Booking Channel Types:** A reservation that flows through an intermediary distribution system before reaching the PMS. The booking originates from a travel agent, GDS (like Amadeus/Sabre), or wholesale platform, passes through a central reservation system, then arrives at the property.

**SiteMinder Modification/Cancellation:** An update to an existing reservation originally delivered to the PMS through SiteMinder's channel manager. These messages track changes or cancellations to bookings that SiteMinder previously distributed, ensuring systems stay in sync.

{% hint style="success" %}
See `Reservation types` structure examples in the [POS / Source](#pos-source) section of this page.
{% endhint %}

#### **HotelReservation**

* Represents a single booking from one channel.
* Always contains exactly one reservation per message.
* Includes all associated rooms, guests, and payments.

```xml
<OTA_HotelResNotifRQ
	xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</OTA_HotelResNotifRQ>
```

<table><thead><tr><th width="253" valign="middle">Element / @Attribute</th><th width="133">Type</th><th width="51" align="center">M</th><th valign="middle">Description</th></tr></thead><tbody><tr><td valign="middle"><strong><code>OTA_HotelResNotifRQ</code></strong></td><td>Element</td><td align="center">1</td><td valign="middle">Root element for the request.</td></tr><tr><td valign="middle"><code>@xmlns</code></td><td>String</td><td align="center">1</td><td valign="middle">Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td valign="middle"><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td valign="middle">Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td valign="middle"><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td valign="middle">Time when the request was generated. TimeStamp must use <code>ISO 8601</code> format.</td></tr><tr><td valign="middle"><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td valign="middle">Specifies the API version. Current Version <code>1.0</code></td></tr></tbody></table>

### HotelReservations

{% tabs %}
{% tab title="Reserved" %}
A confirmed booking that has been accepted. The guest has not yet arrived at the property. Any modification of this booking will be sent with this `ResStatus`.

```xml
<HotelReservations>
	<HotelReservation ResStatus="Reserved" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% code title="WalkInIndicator=" %}

```xml
<HotelReservations>
	<HotelReservation ResStatus="Reserved" WalkInIndicator="true" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% endcode %}
{% endtab %}

{% tab title="Waitlisted" %}
A tentative booking placed on a waiting list when the requested room/dates are not immediately available. Will be confirmed if availability opens up.

```xml
<HotelReservations>
	<HotelReservation ResStatus="Waitlisted" CreateDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% code title="WalkInIndicator=" %}

```xml
<HotelReservations>
	<HotelReservation ResStatus="Waitlisted" WalkInIndicator="true" CreateDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% endcode %}
{% endtab %}

{% tab title="Cancelled" %}
A previously confirmed reservation that has been terminated by either the guest or hotel before the arrival date.

```xml
<HotelReservations>
	<HotelReservation ResStatus="Cancelled" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% code title="WalkInIndicator=" %}

```xml
<HotelReservations>
	<HotelReservation ResStatus="Cancelled" WalkInIndicator="true" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% endcode %}
{% endtab %}

{% tab title="No-show" %}
A confirmed reservation where the guest failed to arrive on the scheduled check-in date without prior cancellation notice.

```xml
<HotelReservations>
	<HotelReservation ResStatus="No-show" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% code title="WalkInIndicator=" %}

```xml
<HotelReservations>
	<HotelReservation ResStatus="No-show" WalkInIndicator="true" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% endcode %}
{% endtab %}

{% tab title="In-house" %}
An active reservation where the guest has checked in and is currently staying at the property.

```xml
<HotelReservations>
	<HotelReservation ResStatus="In-house" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% code title="WalkInIndicator=" %}

```xml
<HotelReservations>
	<HotelReservation ResStatus="In-house" WalkInIndicator="true" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% endcode %}
{% endtab %}

{% tab title="Checked-Out" %}
A completed reservation where the guest has departed from the property and settled their account.

```xml
<HotelReservations>
	<HotelReservation ResStatus="Checked-Out" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% code title="WalkInIndicator=" %}

```xml
<HotelReservations>
	<HotelReservation ResStatus="Checked-Out" WalkInIndicator="true" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-05T15:30:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

{% endcode %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="57" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>HotelReservations</code></td><td>Element</td><td align="center">1</td><td>Contains the reservation details.</td></tr><tr><td><code>HotelReservation</code></td><td>Element</td><td align="center">1</td><td>Contains the specific reservation information.</td></tr><tr><td><code>@ResStatus</code></td><td>Enumeration</td><td align="center">1</td><td><p>Status is:</p><p><code>Reserved</code></p><p><code>Waitlisted</code></p><p><code>Cancelled</code></p><p><code>No-show</code></p><p><code>In-house</code></p><p><code>Checked-Out</code></p></td></tr><tr><td><code>@CreateDateTime</code></td><td>DateTime</td><td align="center">1</td><td><p>Date and time when the reservation was first made.</p><p><code>CreateDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</p></td></tr><tr><td><code>@LastModifyDateTime</code></td><td>DateTime</td><td align="center">0..1</td><td>This indicates the last date and time when the reservation was last modified. Mandatory if a message relating to this reservation has already been uploaded.<br><br>If the same <code>LastModifyDateTime</code> is sent in multiple reservation events, only the first will be processed and the rest ignored since it is considered as the same reservation version.<br><code>LastModifyDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>@CreatorID</code></td><td>String</td><td align="center">0..1</td><td>The creator ID could be a software system identifier or an identifier of an employee responsible for the creation.</td></tr><tr><td><code>@LastModifierID</code></td><td>String</td><td align="center">0..1</td><td>Identifies the last software system or person to modify a record.</td></tr><tr><td><code>@WalkInIndicator</code></td><td>Boolean</td><td align="center">0..1</td><td>Used to identify if the reservation is a walk-in reservation.<br>This attribute is mandatory if a reservation has been generated in the PMS.</td></tr></tbody></table>

### POS / Source

{% tabs %}
{% tab title="PMS Reservations " %}
Contains a single `Source` element with `RequestorID Type="10"` and `BookingChannel Type="4"` . The `CompanyName@Code` attribute should identify your PMS. The `WalkInIndicator` attribute must be present on the `HotelReservation` element for PMS reservations. If the reservation is a 'walk-in' reservation then the `WalkInIndicator` attribute must be `'true'`

```xml
<POS>
	<Source>
		<RequestorID Type="10" ID="PMSCODE"/>
		<BookingChannel Primary="true" Type="4">
			<CompanyName Code="PMSCODE">PMS NAME</CompanyName>
		</BookingChannel>
	</Source>
</POS>
```

{% endtab %}

{% tab title="Internet " %}
Contains a single `Source` element with `RequestorID Type="10"` and `BookingChannel Type="7"` (Internet). The `CompanyName@Code` must identify the specific booking channel code using our [Booking Agent Codes](https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/booking-agent-codes).

```xml
<POS>
	<Source>
		<RequestorID Type="10" ID="PMSCODE"/>
		<BookingChannel Primary="true" Type="7">
			<CompanyName Code="DCC">Directly Connected Channel Name</CompanyName>
		</BookingChannel>
	</Source>
</POS>
```

{% endtab %}

{% tab title="Other Booking Channel Types" %}
Contains two `Source` elements: \
\
\- Primary identifying the central system with `Primary="true"` and the appropriate `BookingChannel@Type` for the system that is handling the reservations. For the full list of Booking Channel Types see [Booking Channel Types Code List](https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/opentravel-codes-list#booking-channel-type-bct)\
&#x20;\
\- Secondary with `BookingChannel Primary="false"` and typically `Type="7"`, identifying the original booking source. The `CompanyName@Code` must identify the specific booking channel code using our [Booking Agent Codes](https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/booking-agent-codes).

```xml
<POS>
	<Source>
		<RequestorID Type="10" ID="PMSCODE"/>
		<BookingChannel Primary="true" Type="5">
			<CompanyName Code="CBA">Central Reservation System Name</CompanyName>
		</BookingChannel>
	</Source>
	<Source>
		<BookingChannel Primary="false" Type="7">
			<CompanyName Code="ABC">Booking Channel Name</CompanyName>
		</BookingChannel>
	</Source>
</POS> 
```

{% endtab %}

{% tab title="SiteMinder Modification/Cancellation" %}
Contains a single `Source` element with `RequestorID Type="10"` and `BookingChannel Type="4"`. The `CompanyName` and `@Code` should identify your PMS. The `HotelReservation` element's `ResStatus` attribute indicates the action (Cancelled, Modified, etc.).

```xml
<POS>
	<Source>
		<RequestorID Type="10" ID="PMSCODE"/>
		<BookingChannel Primary="true" Type="4">
			<CompanyName Code="PMSCODE">PMS NAME</CompanyName>
		</BookingChannel>
	</Source>
</POS> 
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="208">Element / @Attribute</th><th width="112">Type</th><th width="71" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>POS</code></td><td>Element</td><td align="center">1</td><td>Point of Sale (POS) identifies the party or connection channel making the request.</td></tr><tr><td><code>Source</code></td><td>Element</td><td align="center">1..10</td><td>This holds the details about the requestor. It may be repeated to also accommodate the delivery systems. Provides information on the source of a request.</td></tr><tr><td><code>RequestorID</code></td><td>Element</td><td align="center">1</td><td>This identifies the system which is sending the reservation. This element <strong>must</strong> appear in the first Source element.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><code>10</code> for PMS</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>PMS Code assigned by SiteMinder. Remains the same throughout the messages.</td></tr><tr><td><code>BookingChannel</code></td><td>Element</td><td align="center">0..1</td><td>Contains booking channel information.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><p>The type of booking channel:</p><p><code>4</code> - Identifier Property management system (PMS).</p><p><code>5</code> - Identifier for Central reservation system (CRS).</p><p><code>7</code> - Identifier for Internet.</p><p><br>Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#booking-channel-type-bct">OpenTravel Code List Booking Channel Type (BCT)</a>.</p></td></tr><tr><td><code>@Primary</code></td><td>Boolean</td><td align="center">0..1</td><td><p><code>true</code> for the primary booking channel in the first Source element.</p><p><code>false</code> in the second Source element.</p></td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">1</td><td>Identifies the company that is associated with the booking channel.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Identifies a company by the company code.<br>The Code must identify the specific booking channel code using our <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/booking-agent-codes">Booking Agent Codes</a>.</td></tr></tbody></table>

### UniqueID

```xml
<UniqueID ID="BDC-123456789"/>
```

<table><thead><tr><th width="223">Element / @Attribute</th><th width="142">Type</th><th width="64">M</th><th>Description</th></tr></thead><tbody><tr><td><code>UniqueID</code></td><td>Element</td><td>1</td><td>Used to provide PMS and/or CRS identifiers. An identifier used to uniquely reference an object in a system (e.g. an airline reservation reference, customer profile reference, booking confirmation number, or a reference to a previous availability quote).</td></tr><tr><td><code>@ID</code></td><td>String</td><td>1</td><td>A unique identifying value assigned by the creating system. The ID attribute may be used to reference a primary-key value within a database or in a particular implementation.</td></tr></tbody></table>

### RoomStays

```xml
<RoomStays>
	<RoomStay PromotionCode="AUTUNM2024">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</RoomStay>
	<!-- Additional RoomStay elements -->
</RoomStays>
```

<table><thead><tr><th width="252">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>RoomStays</code></td><td>Element</td><td align="center">1</td><td>A collection of RoomStay objects. Room stays associated with this reservation.</td></tr><tr><td><code>RoomStay</code></td><td>Element</td><td align="center">1..n</td><td>One instance of <code>RoomStay</code> per room type booked.</td></tr><tr><td><code>@MarketCode</code></td><td>String</td><td align="center">0..1</td><td>The code that relates to the market being sold to (e.g., the corporate market, packages).</td></tr><tr><td><code>@SourceOfBusiness</code></td><td>String</td><td align="center">0..1</td><td>To specify where the business came from e.g. radio, newspaper ad, etc.</td></tr><tr><td><code>@PromotionCode</code></td><td>String</td><td align="center">0..1</td><td>If configured, this is the promotion code indicating, for instance, a specific marketing campaign (not the rate code).</td></tr></tbody></table>

### RoomTypes

```xml
<RoomTypes>
	<RoomType RoomID="15" RoomType="Double" RoomTypeCode="DBL">
		<RoomDescription>
			<Text>Double</Text>
		</RoomDescription>
	</RoomType>
</RoomTypes>
```

<table><thead><tr><th width="255">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>RoomTypes</code></td><td>Element</td><td align="center">0..1</td><td>A collection of Room Types associated with a particular Room Stay.</td></tr><tr><td><code>RoomType</code></td><td>Element</td><td align="center">0..1</td><td>Provides details regarding rooms, usually guest rooms. Can be sent to give more information on the room type for this room stay.</td></tr><tr><td><code>@RoomType</code></td><td>String</td><td align="center">0..1</td><td>A code value that indicates the type of room for which this request is made, e.g.: double, king, etc. Values may use the Hotel Descriptive Content table or a codes specific to the property or hotel brand.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">0..1</td><td>Specific system room type code, ex: A1K, A1Q etc.</td></tr><tr><td><code>@RoomCategory</code></td><td>Integer</td><td align="center">0..1</td><td><p>Indicates the category of the room. Typical values would be <code>Moderate</code>, <code>Standard</code>, or <code>Deluxe</code>.</p><p>Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#segment-category-code-seg">OpenTravel Code List Segment Category Code (SEG)</a></p></td></tr><tr><td><code>@RoomID</code></td><td>Integer</td><td align="center">0..1</td><td>A string value representing the unique identification of a room if the request is looking for a specific room.</td></tr><tr><td><code>@NonSmoking</code></td><td>Boolean</td><td align="center">0..1</td><td>Non-smoking indicator.</td></tr><tr><td><code>@Configuration</code></td><td>String</td><td align="center">0..1</td><td>Textual description of room configuration.</td></tr><tr><td><code>RoomDescription</code></td><td>Element</td><td align="center">0..1</td><td>Textual information regarding the room.</td></tr><tr><td><code>@Text</code></td><td>Element</td><td align="center">0..n</td><td>A text description of the room</td></tr><tr><td><code>AdditionalDetails</code></td><td>Element</td><td align="center">0..1</td><td>Container for additional information about this room.</td></tr><tr><td><code>AdditionalDetail</code></td><td>Element</td><td align="center">1..n</td><td></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">0..1</td><td>Used to define the type of information being sent (e.g., rate description, property description, room information). Refer to the <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/opentravel-codes-list#additional-detail-type-adt">Additional Detail Type (ADT)</a>.<br>Some common usages are:<br><code>43</code> - Meal plan information<br><code>15</code> - Promotion information</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Trading partner code associated to AdditionalDetailType.</td></tr><tr><td><code>DetailDescription</code></td><td>Element</td><td align="center">0..1</td><td>Textual description of AdditionalDetail information.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..n</td><td>A text description of AdditionalDetail</td></tr></tbody></table>

### RatePlans

```xml
<RatePlans>
	<RatePlan RatePlanCode="WKGPKG" EffectiveDate="2017-12-01" ExpireDate="2017-12-03" RatePlanName="Weekend Package">
		<RatePlanDescription>
			<Text>Weekend Package includes wine, chocolates, champagne on arrival and late checkout at 3PM</Text>
		</RatePlanDescription>
		<RatePlanInclusions TaxInclusive="true" ServiceFeeInclusive="false">
			<RatePlanInclusionDescription>
				<Text>Champagne on arrival, English Breakfast, Chocolates and 3PM Checkout </Text>
			</RatePlanInclusionDescription>
		</RatePlanInclusions>
		<MealsIncluded MealPlanIndicator="true" MealPlanCodes="7"/>
		<!-- Additional MealsIncluded elements -->
	</RatePlan>
</RatePlans>
```

<table><thead><tr><th width="284">Element / @Attribute</th><th width="112">Type</th><th width="61" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>RatePlans</code></td><td>Element</td><td align="center">0..1</td><td>A collection of Rate Plans associated with a particular Room Stay.</td></tr><tr><td><code>RatePlan</code></td><td>Element</td><td align="center">0..1</td><td>Defines the details of the rate plan as used in the booking process.</td></tr><tr><td><code>@RatePlanName</code></td><td>String</td><td align="center">0..1</td><td>Provides the name of the rate plan or group. Typically used with RatePlanType to further describe the rate plan.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>The effective date of the RatePlan.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>The expire date for a RatePlan, this should be considered an exclusive date, the date for which the current rate plan information is no longer valid.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the rate booked.</td></tr><tr><td><code>RatePlanDescription</code></td><td>Element</td><td align="center">0..1</td><td>Textual description of the RatePlan.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..n</td><td>A text description of the RatePlan.</td></tr><tr><td><code>RatePlanInclusions</code></td><td>Element</td><td align="center">0..1</td><td>Defines charges that are included in this rate plan.</td></tr><tr><td><code>@TaxInclusive</code></td><td>Boolean</td><td align="center">0..1</td><td>Indicates that service fees are included in the rate.</td></tr><tr><td><code>@ServiceFeeInclusive</code></td><td>Boolean</td><td align="center">0..1</td><td>Indicates that tax is included in the rate.</td></tr><tr><td><code>RatePlanInclusionDescription</code></td><td>Element</td><td align="center">0..1</td><td>Textual description of what is included in the rate plan.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..1</td><td>A text description of the RatePlanInclusionDescription</td></tr><tr><td><code>MealsIncluded</code></td><td>Element</td><td align="center">0..1</td><td>Container.</td></tr><tr><td><code>@MealPlanIndicator</code></td><td>Boolean</td><td align="center">0..1</td><td>When <code>true</code>, a meal plan is included in this rate plan. When <code>false</code>, a meal plan is not included in this rate plan.</td></tr><tr><td><code>@MealPlanCodes</code></td><td>String</td><td align="center">0..1</td><td>Used to identify the types of meals included with a rate plan.<br>Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#meal-plan-type-mpt">OpenTravel Code List Meal Plan Type (MPT)</a></td></tr><tr><td><code>AdditionalDetails</code></td><td>Element</td><td align="center">0..1</td><td>Textual description of AdditionalDetail information.</td></tr><tr><td><code>AdditionalDetail</code></td><td>Element</td><td align="center">0..1</td><td>A text description of AdditionalDetail</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">0..1</td><td>Used to define the type of information being sent (e.g., rate description, property description, room information). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#additional-detail-type-adt">OpenTravel Code List Additional Detail Type (ADT)</a><br>Some common usages are:<br><code>43</code> - Meal plan information<br><code>15</code> - Promotion information</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Trading partner code associated to AdditionalDetailType.</td></tr><tr><td><code>DetailDescription</code></td><td>Element</td><td align="center">0..1</td><td>Textual description of AdditionalDetail information.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..n</td><td>A text description of AdditionalDetail</td></tr></tbody></table>

### RoomRates

{% tabs %}
{% tab title="Room Rates" %}

```xml
<RoomRates>
	<RoomRate InvBlockCode="HIGHROLL" NumberOfUnits="1" RoomID="1501" RoomTypeCode="DLX" RatePlanCode="WKGPKG" RatePlanCategory="Consumer Packages" EffectiveDate="2017-12-01" ExpireDate="2017-12-03">
		<Rates>
			<Rate EffectiveDate="2017-12-01" ExpireDate="2017-12-02" UnitMultiplier="1">
				<Base AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD">
					<Taxes CurrencyCode="AUD" Amount="10.00">
						<Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10">
							<TaxDescription>
								<Text>GST</Text>
							</TaxDescription>
						</Tax>
					</Taxes>
				</Base>
				<Total AmountBeforeTax="120.00" AmountAfterTax="132.00" CurrencyCode="AUD">
					<Taxes CurrencyCode="AUD" Amount="12.00">
						<Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10">
							<TaxDescription>
								<Text>GST</Text>
							</TaxDescription>
						</Tax>
					</Taxes>
				</Total>
			</Rate>
		</Rates>
		<!-- Additional Rates elements -->
		<ServiceRPHs>
			<ServiceRPH RPH="1"/>
			<!-- Additional ServiceRPH elements -->
		</ServiceRPHs>
	</RoomRate>
</RoomRates>
```

{% endtab %}

{% tab title="Same Value per Night" %}

```xml
<RoomRates>
	<RoomRate InvBlockCode="HIGHROLL" NumberOfUnits="1" RoomID="1501" RoomTypeCode="DLX" RatePlanCode="WKGPKG" RatePlanCategory="Consumer Packages" EffectiveDate="2017-12-01" ExpireDate="2017-12-03">
		<Rates>
			<Rate UnitMultiplier="1" EffectiveDate="2024-10-05" ExpireDate="2024-10-08">
				<Base AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR"/>
			<!-- other elements and attributes have been omitted for brevity -->
			</Rate>
		</Rates>
	</RoomRate>
</RoomRates>
```

{% endtab %}

{% tab title="Different Value per Night" %}

```xml
<RoomRates>
	<RoomRate InvBlockCode="HIGHROLL" NumberOfUnits="1" RoomID="1501" RoomTypeCode="DLX" RatePlanCode="WKGPKG" RatePlanCategory="Consumer Packages" EffectiveDate="2017-12-01" ExpireDate="2017-12-03">
		<Rates>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-05" ExpireDate="2024-10-06">
				<Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-06" ExpireDate="2024-10-07">
				<Base AmountBeforeTax="180.00" AmountAfterTax="200.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-07" ExpireDate="2024-10-08">
				<Base AmountBeforeTax="225.00" AmountAfterTax="250.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
		</Rates>
	</RoomRate>
</RoomRates>
```

{% endtab %}

{% tab title="Combined" %}

```xml
<RoomRates>
	<RoomRate InvBlockCode="HIGHROLL" NumberOfUnits="1" RoomID="1501" RoomTypeCode="DLX" RatePlanCode="WKGPKG" RatePlanCategory="Consumer Packages" EffectiveDate="2017-12-01" ExpireDate="2017-12-03">
		<Rates>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-05" ExpireDate="2024-10-07">
				<Base AmountBeforeTax="360.00" AmountAfterTax="400.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-07" ExpireDate="2024-10-08">
				<Base AmountBeforeTax="198.00" AmountAfterTax="220.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
		</Rates>
	</RoomRate>
</RoomRates>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="128">Type</th><th width="70.203125" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>RoomRates</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the rates applied to the room stay.</td></tr><tr><td><code>RoomRate</code></td><td>Element</td><td align="center">1..n</td><td>One RoomRate per RoomStay. Multiple rates are listed under the RoomRate.</td></tr><tr><td><code>@InvBlockCode</code></td><td>String</td><td align="center">0..1</td><td>Code that identifies an inventory block.</td></tr><tr><td><code>@NumberOfUnits</code></td><td>Integer</td><td align="center">0..1</td><td>Must be set to <code>1</code>. If there are multiple RoomStays for the same RoomTypeCode and RatePlanCode, multiple RoomStay elements should be sent.</td></tr><tr><td><code>@RoomID</code></td><td>String</td><td align="center">0..1</td><td>A string value representing the unique identification of a room.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the room booked.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the rate plan booked. Must be included if RoomStay / RatePlans is present.</td></tr><tr><td><code>@RatePlanCategory</code></td><td>String</td><td align="center">0..1</td><td>Hotel systems often group multiple rate plans into a single category. This refers to that category that is specific to the hotel CRS/ PMS and should not be confused with a GDS rate category.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">1</td><td>ExpireDate is the first day after the applicable period (e.g. when expire date is 2012-04-03 the last date of the period is 2012-04-02). Format yyyy-MM-dd. This date is exclusive.</td></tr><tr><td><code>Rates</code></td><td>Element</td><td align="center">0..1</td><td>Container that will contain instances of Rates.</td></tr><tr><td><code>Rate</code></td><td>Element</td><td align="center">1..n</td><td>Rate will contain a timespan for which a rate will apply for a room type. Multiple instances of Rate will be sent if rate changes apply.</td></tr><tr><td><code>@UnitMultiplier</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>1</code>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">1</td><td>Starting date of the rate. This date is inclusive.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">1</td><td>Expire date is the first day after the applicable period. This date is not inclusive.</td></tr><tr><td><code>Base</code></td><td>Element</td><td align="center">1</td><td>Base amount charged for the accommodation.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>Tax percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..5</td><td>Text description of the taxes.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..n</td><td>Textual description of the tax</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>Total amount charged, including additional occupants and fees. If empty, assume the Base amount equals the Total amount.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..99</td><td>An individual tax per tax element. This element allows for both percentages and flat amounts. If one field is used, the other should be zero since logically, taxes should be calculated in only one of the two ways.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>The type of tax being applied to the total. Refer to the <a href="/pages/IG8dKV52Ty9x3QCHTV1x#fee-tax-type-ftt">OpenTravel Code List Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Integer</td><td align="center">0..1</td><td>A monetary amount of tax. if zero, assume use of the Percent attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>Tax percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..5</td><td>Text description of the taxes.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">0..n</td><td>Textual description of the tax</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>The Total amount charged for the accommodation or service per unit of time.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Integer</td><td align="center">0..1</td><td>The Total amount charged for the accommodation or service per unit of time.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Integer</td><td align="center">0..1</td><td>The total amount including all associated taxes (e.g., sales tax, VAT, GST or any associated tax).</td></tr><tr><td><code>@CurrencyCode</code></td><td>Integer</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>A collection of taxes.</td></tr><tr><td><code>@CurrencyCode</code></td><td>Integer</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Integer</td><td align="center">0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..99</td><td>An individual tax per tax element. This element allows for both percentages and flat amounts. If one field is used, the other should be zero since logically, taxes should be calculated in only one of the two ways.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>The type of tax is applied to the total. Refer to the <a href="/pages/IG8dKV52Ty9x3QCHTV1x#fee-tax-type-ftt">OpenTravel Code List Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Integer</td><td align="center">0..1</td><td>A monetary amount of tax. if zero, assume use of the Percent attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>@CurrencyCode</code></td><td>Integer</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>Tax percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>TaxDescription</code></td><td>String</td><td align="center">0..5</td><td>Text description of the taxes.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">0..n</td><td>Textual description of the tax</td></tr><tr><td><code>ServiceRPHs</code></td><td>Element</td><td align="center">0..1</td><td>A collection of unsigned integers that reference the RPH (Reference Place holder) attribute in the Service object. The ServiceRPH attribute in the Service object is an indexing attribute that identifies the services attached this RoomRate.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">1..n</td><td>This is a reference placeholder used as an index for a service to be associated with this stay</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Provides a unique reference to the service.</td></tr></tbody></table>

### **GuestCounts**

```xml
<GuestCounts>
	<GuestCount AgeQualifyingCode="10" Age="51" Count="1" AgeBucket="AdultOver50"/>
	<GuestCount AgeQualifyingCode="10" Age="44" Count="1" AgeBucket="AdultOver40"/>
</GuestCounts>
```

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>GuestCounts</code></td><td>Element</td><td align="center">1</td><td>Total guest counts, divided by age group (adult, child, infant). Adult count must always be sent.</td></tr><tr><td><code>GuestCount</code></td><td>Element</td><td align="center">1..n</td><td>Represents the count for a specific age group.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">1</td><td><p><code>10</code> = Adult (mandatory)</p><p><code>8</code> = Child (optional)</p><p><code>7</code> = Infant (optional)</p></td></tr><tr><td><code>@Count</code></td><td>Integer</td><td align="center">1</td><td>Number of guests for this age group.</td></tr><tr><td><code>@Age</code></td><td>Integer</td><td align="center">0..1</td><td>Age of the guest, required only for children and infants.</td></tr><tr><td><code>@AgeBucket</code></td><td>String</td><td align="center">0..1</td><td>Defines the age range category or bucket a guest can be booked into. This is typically used in conjunction with the age qualifying code to further define the applicable age range.</td></tr></tbody></table>

### TimeSpan

```xml
<TimeSpan Start="2024-10-05" End="2024-10-08"/>
```

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>TimeSpan</code></td><td>Element</td><td align="center">1</td><td>Contains the timespan for the RoomStay.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>Check-in date.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>Check-out date. Must be after Start.</td></tr></tbody></table>

### Guarantee

```xml
<Guarantee GuaranteeCode="COMBINED_GUARANTEE" GuaranteeType="DepositRequired">
	<GuaranteesAccepted>
		<GuaranteeAccepted PaymentTransactionTypeCode="charge">
			<PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720">
				<CardHolderName>Leonard Woolf</CardHolderName>
				<CardNumber Mask="4021XXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber>
			</PaymentCard>
		</GuaranteeAccepted>
		<GuaranteeAccepted PaymentTransactionTypeCode="charge">
			<Voucher SeriesCode="4555"/>
		</GuaranteeAccepted>
		<GuaranteeAccepted PaymentTransactionTypeCode="charge">
			<DirectBill DirectBill_ID="4981003"/>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
	<GuaranteeDescription>
		<Text>Combined Guarantees Accepted (Platinum Membership)</Text>
	</GuaranteeDescription>
</Guarantee>
```

<table><thead><tr><th width="274">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Guarantee</code></td><td>Element</td><td align="center">0..1</td><td>Guarantee provided with the reservation. Used if no deposit is paid for the reservation.</td></tr><tr><td><code>@GuaranteeCode</code></td><td>String</td><td align="center">0..1</td><td>Contains the details of accepted Guarantee Code.</td></tr><tr><td><code>@GuaranteeType</code></td><td>Enumeration</td><td align="center">0..1</td><td><p>An enumerated type defining the guarantee to be applied to this reservation.</p><p><strong>Value:</strong><br>CC/DC/Voucher<br>Deposit<br>DepositRequired<br>GuaranteeRequired<br>None<br>PrePay<br>Profile</p></td></tr><tr><td><code>GuaranteesAccepted</code></td><td>Element</td><td align="center">0.1</td><td>The guarantee information associated to the Room Stay. A maximum of 5 occurrences are available for use depending on the context.</td></tr><tr><td><code>GuaranteeAccepted</code></td><td>Element</td><td align="center">1..n</td><td><p>Guarantee Detail.</p><p>One of PaymentCard, Voucher, DirectBill elements must be included within GuranteeAccepted.</p></td></tr><tr><td><code>@PaymentTransactionTypeCode</code></td><td>String</td><td align="center">0..1</td><td><p>This is used to indicate either a <strong>charge</strong>, reserve (deposit) or refund.</p><p>charge: This indicates that an actual payment has been made.</p><p><strong>refund</strong>: This indicates that the payment amount of this PaymentDetail element is for a refund.</p><p><strong>reserve</strong>: This indicates that a hold for the indicated amount has been placed on a credit card or that a cash amount has been taken from the customer to guarantee final payment.</p></td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">0..1</td><td>Specific payment card information. Details of a debit or credit card.</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">1</td><td>2-character code of the credit card issuer. Refer to <a href="/pages/Iqs1qAbBKAcBqhyyZHQt">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>String</td><td align="center">0..1</td><td>Indicates the starting date. format <code>MMyy</code>).</td></tr><tr><td><code>@ExpireDate</code></td><td>String</td><td align="center">0..1</td><td>Expiry date of the credit card (format <code>MMyy</code>).</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td align="center">0..1</td><td>Card Holder Name</td></tr><tr><td><code>CardNumber</code></td><td>String</td><td align="center">0..1</td><td>Secure information that supports PCI tokens, data masking and other encryption methods.</td></tr><tr><td><code>@Mask</code></td><td>String</td><td align="center">0..1</td><td>Masked data.</td></tr><tr><td><code>@Token</code></td><td>Integer</td><td align="center">0..1</td><td>Tokenized information.</td></tr><tr><td><code>@TokenProviderID</code></td><td>String</td><td align="center">0..1</td><td>Provider ID.</td></tr><tr><td><code>Voucher</code></td><td>Element</td><td align="center">0..1</td><td>Identification of a series of coupons or vouchers identified by serial number(s).</td></tr><tr><td><code>@SeriesCode</code></td><td>String</td><td align="center">0..1</td><td>Identification of a series of coupons or vouchers identified by serial number(s).</td></tr><tr><td><code>DirectBill</code></td><td>Element</td><td align="center">0..1</td><td>Details of a direct billing arrangement.</td></tr><tr><td><code>@DirectBill_ID</code></td><td>Integer</td><td align="center">0..1</td><td>Identifier for the organization to be billed directly for travel services.</td></tr><tr><td><code>GuaranteeDescription</code></td><td>Element</td><td align="center">0..1</td><td>Text description relating to the Guarantee.</td></tr><tr><td><code>Text</code></td><td>Sting</td><td align="center">0..n</td><td>Textual information relating to the Guarantee.</td></tr></tbody></table>

### DepositPayments

```xml
<DepositPayments>
	<GuaranteePayment>
		<AcceptedPayments>
			<AcceptedPayment PaymentTransactionTypeCode="charge">
				<PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720">
					<CardHolderName>Leonard Woolf</CardHolderName>
					<CardNumber Mask="4021XXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber>
				</PaymentCard>
			</AcceptedPayment>
		</AcceptedPayments>
		<AmountPercent Percent="30" CurrencyCode="AUD" Amount="64.52" NmbrOfNights="2">
			<Taxes CurrencyCode="AUD" Amount="1.29">
				<Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="2">
					<TaxDescription>
						<Text>Credit Card surcharge.</Text>
					</TaxDescription>
				</Tax>
			</Taxes>
		</AmountPercent>
		<Deadline AbsoluteDeadline="2017-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/>
		<Description>
			<Text>30% deposit (of the total cost of the stay) will be charged to card holder's account 10 days before the date of arrival at the latest.</Text>
		</Description>
		<Address Type="1">
			<AddressLine>12 Pine Street</AddressLine>
			<CityName>Sydney</CityName>
			<PostalCode>2095</PostalCode>
			<StateProv StateCode="NSW">New South Wales</StateProv>
			<CountryName Code="AU">Australia</CountryName>
		</Address>
		<!-- Additional GuaranteePayment Elements -->
	</GuaranteePayment>
</DepositPayments>
```

<table><thead><tr><th width="215">Element / @Attribute</th><th width="94">Type</th><th width="74">M</th><th>Description</th></tr></thead><tbody><tr><td><code>DepositPayments</code></td><td>Element</td><td>0..1</td><td>A collection of required payments.</td></tr><tr><td><code>GuaranteePayment</code></td><td>Element</td><td>1..n</td><td>Used to define the deposit policy, guarantees policy, and/or accepted forms of payment.</td></tr><tr><td><code>AcceptedPayments</code></td><td>Element</td><td>0..1</td><td>Collection of forms of payment accepted for payment. Used to define the types of payments accepted.</td></tr><tr><td><code>AcceptedPayment</code></td><td>Element</td><td>0..1</td><td>An acceptable form of payment.</td></tr><tr><td><code>@PaymentTransactionTypeCode</code></td><td>String</td><td>0..1</td><td><p><code>charge</code> - This indicates that an actual payment has been made.</p><p><code>refund</code>- This indicates that the payment amount of this PaymentDetail element is for a refund.</p><p><code>reserve</code> - This indicates that a hold for the indicated amount has been placed on a credit card or that a cash amount has been taken from the customer to guarantee final payment.</p></td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td>0..1</td><td><p>Specific payment card information. Details of a debit or credit card.<br></p><p><strong>NOTE:</strong> PCI-sensitive payment card information should not be included in the message. Do not attempt to send any payment card data for there isn't a specific element or attribute in the API.</p></td></tr><tr><td><code>@CardCode</code></td><td>String</td><td>0..1</td><td>Issuer code. See <a href="/pages/Iqs1qAbBKAcBqhyyZHQt">OTA Payment Card Provider Codes</a></td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td>0..1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td>0..1</td><td>Indicates the ending date.</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td>0..1</td><td>Card holder name.</td></tr><tr><td><code>CardNumber</code></td><td>Element</td><td>0..1</td><td>Secure information that supports PCI tokens, data masking and other encryption methods.</td></tr><tr><td><code>@Mask</code></td><td>String</td><td>0..1</td><td>Masked data.</td></tr><tr><td><code>@Token</code></td><td>Integer</td><td>0..1</td><td>Tokenized information.</td></tr><tr><td><code>@TokenProviderID</code></td><td>String</td><td>0..1</td><td>Provider ID.</td></tr><tr><td><code>Voucher</code></td><td>Element</td><td>0..1</td><td>Details of a paper or electronic document indicating prepayment.</td></tr><tr><td><code>@SeriesCode</code></td><td>Integer</td><td>0..1</td><td>Identification of a series of coupons or vouchers identified by serial number(s).</td></tr><tr><td><code>DirectBill</code></td><td>Element</td><td>0..1</td><td>Details of a direct billing arrangement.</td></tr><tr><td><code>@DirectBill_ID</code></td><td>Integer</td><td>0..1</td><td>Identifier for the organization to be billed directly for travel services.</td></tr><tr><td><code>AmountPercent</code></td><td>Element</td><td>0..1</td><td>Payment expressed as a fixed amount, or a percentage of/or room nights. If the the Total.amountAfterTax is provided, it will be a percentage of this value. If only the amountBeforeTax is provided it will be the percentage of this value. At least @Amount or @Percent will be populated.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td>0..1</td><td>The percentage used to calculate the amount.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td>0..1</td><td>A monetary amount taken for the deposit.</td></tr><tr><td><code>@NmbrOfNights</code></td><td>Integer</td><td>0..1</td><td>The number of nights of the hotel stay that are used to calculate the fee amount.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td>0..1</td><td>A collection of taxes relating to the deposit.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Integer</td><td>0..1</td><td></td></tr><tr><td><code>Tax</code></td><td>Element</td><td>0..99</td><td>An individual tax. This element allows for both percentages and flat amounts. If one field is used, the other should be zero since logically, taxes should be calculated in only one of the two ways.</td></tr><tr><td><code>@Code</code></td><td>String</td><td>0..1</td><td>Code identifying the fee (e.g., agency fee, municipality fee). Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">OpenTravel Code List Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td>0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td>0..1</td><td>Fee percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td>0..5</td><td>Text description of the taxes.</td></tr><tr><td><code>Text</code></td><td>Element</td><td>0..n</td><td>Textual description of the tax</td></tr><tr><td><code>Deadline</code></td><td>Element</td><td>0..2</td><td>Payment deadline, absolute or relative.</td></tr><tr><td><code>@AbsoluteDeadline</code></td><td>DateTime</td><td>0..1</td><td>Defines the absolute deadline. Either this or the offset attributes may be used.</td></tr><tr><td><code>@OffsetTimeUnit</code></td><td>String</td><td>0..1</td><td>The units of time, e.g.: days, hours, etc., that apply to the deadline.</td></tr><tr><td><code>@OffsetUnitMultiplier</code></td><td>Integer</td><td>0..1</td><td>The number of units of DeadlineTimeUnit.</td></tr><tr><td><code>@OffsetDropTime</code></td><td>String</td><td>0..1</td><td>An enumerated type indicating when the deadline drop time goes into effect.</td></tr><tr><td><code>Description</code></td><td>Element</td><td>0..5</td><td>Text description of the Payment in a given language.</td></tr><tr><td><code>Text</code></td><td>String</td><td>0..n</td><td>Textual information information relating to the payment.</td></tr><tr><td><code>Address</code></td><td>String</td><td>0..1</td><td>The address to which a deposit may be sent.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td>0..1</td><td>Defines the type of address (e.g. home, business, other). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#communication-location-type-clt">OpenTravel Code List Communication Location Type (CLT)</a>.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td>0..5</td><td>Address including any relevant street number.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td>0..1</td><td>City.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td>0..1</td><td>Postal code.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td>0..1</td><td>State, province, or region name or code needed to identify location.</td></tr><tr><td><code>@StateCode</code></td><td>Integer</td><td>0..1</td><td>The standard code or abbreviation for the state, province, or region.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td>0..1</td><td>The name or code of a country (as used in an address).</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td>0..1</td><td><code>ISO 3166</code> code for a country.</td></tr></tbody></table>

### Discount

```xml
<Discount TaxInclusive="true" Percent="15" DiscountCode="STAYNSAVE15" AmountBeforeTax="33.00" AmountAfterTax="36.30" CurrencyCode="AUD">
	<Taxes CurrencyCode="AUD" Amount="3.30">
		<Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10">
			<TaxDescription>
				<Text>GST</Text>
			</TaxDescription>
		</Tax>
	</Taxes>
	<DiscountReason>
		<Text>Stay 2 nights and get 15% off.</Text>
	</DiscountReason>
</Discount>
```

<table><thead><tr><th width="208">Element / Attribute</th><th width="100">Type</th><th width="100">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Discount</code></td><td>Element</td><td>0..1</td><td>Discount percentage and/or Amount, code and textual reason for discount.</td></tr><tr><td><code>@TaxInclusive</code></td><td>Boolean</td><td>0..1</td><td>Is Discount tax inclusive.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td>0..1</td><td>Percentage value of the discount.</td></tr><tr><td><code>@DiscountCode</code></td><td>String</td><td>0..1</td><td>Specifies the type of discount (e.g., No condition, LOS, Deposit or Total amount spent).</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td>0..1</td><td>The total amount not including any associated tax (e.g., sales tax, VAT, GST or any associated tax).</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td>0..1</td><td>The total amount including all associated taxes (e.g., sales tax, VAT, GST or any associated tax).</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td>0..1</td><td>A collection of taxes relating to Discount</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td>0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td>0..1</td><td>This element allows for both percentages and flat amounts. If one field is used, the other should be zero since logically, taxes should be calculated in only one of the two ways.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td>0..1</td><td>Code identifying the fee (e.g.,agency fee, municipality fee). Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">OpenTravel Code List Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td>0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td>0..1</td><td>Fee percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td>0..1</td><td>Text description of the taxes.</td></tr><tr><td><code>Text</code></td><td>Element</td><td>0..1</td><td>Textual description of the tax</td></tr><tr><td><code>DiscountReason</code></td><td>Element</td><td>1</td><td>Text description of Discount Reason.</td></tr><tr><td><code>Text</code></td><td>Element</td><td>1</td><td>Textual description of Discount Reason.</td></tr></tbody></table>

### Total

```xml
<Total AmountBeforeTax="187.00" AmountAfterTax="215.05" CurrencyCode="AUD">
	<Taxes CurrencyCode="AUD" Amount="28.05">
		<Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10">
			<TaxDescription>
				<Text>GST</Text>
			</TaxDescription>
		</Tax>
		<Tax Code="21" Amount="0" CurrencyCode="AUD" Percent="5">
			<TaxDescription>
				<Text>Insurance Premium Tax</Text>
			</TaxDescription>
		</Tax>
	</Taxes>
</Total>
```

<table><thead><tr><th width="210">Element / @Attribute</th><th width="114">Type</th><th width="64">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Total</code></td><td>Element</td><td>0..1</td><td>The total amount charged for the service including additional amounts and fees.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td>0..1</td><td>The total amount not including any associated tax (e.g., sales tax, VAT, GST or any associated tax).</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td>0..1</td><td>The total amount including all associated taxes (e.g., sales tax, VAT, GST or any associated tax).</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td>0..1</td><td>A collection of taxes relating to Discount</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td>0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td>0..1</td><td>This element allows for both percentages and flat amounts. If one field is used, the other should be zero since logically, taxes should be calculated in only one of the two ways.</td></tr><tr><td><code>@Code</code></td><td>String</td><td>0..1</td><td>Code identifying the fee (e.g., agency fee, municipality fee). Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">OpenTravel Code List Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td>0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td>0..1</td><td>Fee percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td>0..5</td><td>Text description of the taxes.<br></td></tr><tr><td><code>Text</code></td><td>Element</td><td>0..n</td><td>Textual description of Discount Reason.</td></tr></tbody></table>

### ResGuestRPHs

```xml
<ResGuestRPHs>
	<ResGuestRPH RPH="1"/>
	<ResGuestRPH RPH="2"/>
	<!-- Additional ResGuestRPH elements -->
</ResGuestRPHs>
```

<table><thead><tr><th width="208">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>ResGuestRPHs</code></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ResGuestRPH</code> elements.</td></tr><tr><td><code>ResGuestRPH</code></td><td>Element</td><td align="center">1..n</td><td>Container for the <code>RPH</code> attribute.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links the <code>RoomStay</code> to <code>ResGuest</code>. Find the links in <a href="#resguests">ResGuests</a>.</td></tr></tbody></table>

### Memberships

```xml
<Memberships>
	<Membership ProgramCode="Platinum" AccountID="8943112"/>
	<Membership ProgramCode="Platinum" AccountID="8943966"/>
</Memberships>
```

<table><thead><tr><th width="213">Element / @Attribute</th><th width="106">Type</th><th width="72">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Memberships</code></td><td>Element</td><td>0..1</td><td>A collection of Membership objects. Memberships provides a list of reward programs which may be credited with points accrued from the guest's activity. Which memberships are to be applied to which part is determined by each object's SelectedMembershipRPHs collection.</td></tr><tr><td><code>Membership</code></td><td>Element</td><td>1..n</td><td>The SelectedMembership object identifies the frequent customer reward program and (optionally) indicates points awarded for stay activity.</td></tr><tr><td><code>@ProgramCode</code></td><td>String</td><td>0..1</td><td>The code or name of the membership program ('Hertz', 'AAdvantage', etc.).</td></tr><tr><td><code>@AccountID</code></td><td>String</td><td>0..1</td><td>The account identification number for this particular member in this particular program.</td></tr></tbody></table>

### Comments

```xml
<Comments>
	<Comment GuestViewable="true">
		<Text>Platinum Members are offered a free spa entry for the whole length of stay.</Text>
	</Comment>
</Comments>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Comments</code></td><td>Element</td><td align="center">0..1</td><td>Contains comment for the <code>RoomStay</code>.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1</td><td>Holds the actual comment.</td></tr><tr><td><code>@GuestViewable</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, the comment may be shown to the consumer. When false, the comment may not be shown to the consumer.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>The content of the comment.</p><p>PCI sensitive data is prohibited.</p></td></tr></tbody></table>

### SpecialRequests

```xml
<SpecialRequests>
	<SpecialRequest RequestCode="Bedding Configuration" CodeContext="GUEST_DIRECT">
		<Text>King Split + Single Bed.</Text>
	</SpecialRequest>
	<!-- Additional ServiceRPH elements -->
</SpecialRequests>
```

<table><thead><tr><th width="257">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>SpecialRequests</code></td><td>Element</td><td align="center">0..1</td><td>Contains special requests for the <code>RoomStay</code>.</td></tr><tr><td><code>SpecialRequest</code></td><td>Element</td><td align="center">1..n</td><td>The SpecialRequests related to the RoomStay.</td></tr><tr><td><code>@RequestCode</code></td><td>String</td><td align="center">0..1</td><td>This identifies a special request for this reservation and is typically hotel-specific.</td></tr><tr><td><code>@CodeContext</code></td><td>String</td><td align="center">0..1</td><td>Identifies the source authority for the RequestCode.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..n</td><td>Textual information relating to the SpecialRequest.</td></tr></tbody></table>

### ServiceRPHs

```xml
<ServiceRPHs>
	<ServiceRPH RPH="1"/>
	<!-- Additional ServiceRPH elements -->
</ServiceRPHs>
```

<table><thead><tr><th width="256">Element / @Attribute</th><th width="112">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>ServiceRPHs</code></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ServiceRPH</code> elements.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">1..n</td><td>Service at the <code>RoomStay</code> level.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links a <code>Service</code> to the Service information provided at the HotelReservation level (if applicable).</td></tr></tbody></table>

### Services

```xml
<Services>
	<Service ServicePricingType="Per night" ServiceCategoryCode="PARKING" ServiceInventoryCode="ACAR_PARK" Inclusive="true" Quantity="1" ServiceRPH="1" Type="10" ID="01120212A3" ID_Context="HOTEL">
		<Price>
			<Total AmountBeforeTax="20.00" AmountAfterTax="22.00" CurrencyCode="AUD">
				<Taxes CurrencyCode="AUD" Amount="2.00">
					<Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10">
						<TaxDescription>
							<Text>GST</Text>
						</TaxDescription>
					</Tax>
				</Taxes>
			</Total>
		</Price>
		<ServiceDetails>
			<GuestCounts>
				<GuestCount AgeQualifyingCode="10" Age="44" Count="1" AgeBucket="AdultOver40"/>
			</GuestCounts>
			<TimeSpan Start="2017-12-01" End="2017-12-03"/>
			<Comments>
				<Comment GuestViewable="false">
					<Text>Car space needs to be released before 3PM check-out day. No exceptions allowed.</Text>
				</Comment>
			</Comments>
			<ServiceDescription>
				<Text>Accessible, covered and secured vehicle storage space.</Text>
			</ServiceDescription>
		</ServiceDetails>
	</Service>
	<!-- Additional Service elements -->
	<ServiceCategory ServiceCategoryCode="PARKING"/>
	<ServiceCategory ServiceCategoryCode="GUEST"/>
</Services>
```

<table><thead><tr><th width="214">Element / @Attribute</th><th width="102">Type</th><th width="72" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Services</code></td><td>Element</td><td align="center">0..1</td><td>This is the collection of all services associated with any part of this reservation (the reservation in its entirety, one or more guests, or one or more room stays).</td></tr><tr><td><code>Service</code></td><td>Element</td><td align="center">1..n</td><td>A Service object represents a non-room product provided to guests. Service products may have associated inventory and charges.</td></tr><tr><td><code>@ServicePricingType</code></td><td>String</td><td align="center">0..1</td><td>An enumerated type that defines how a service is priced. Values: Per stay, Per person, Per night, Per person per night, Per use.</td></tr><tr><td><code>@ServiceCategoryCode</code></td><td>String</td><td align="center">0..1</td><td><p>The representation of the specific service category for the service being reserved.</p><p><br></p></td></tr><tr><td><code>@ServiceInventoryCode</code></td><td>String</td><td align="center">0..1</td><td>Identifier code for the service. Refer to <a href="/pages/CiYdiVL1WUiiuWGcKNmx">Service and Extra Charge</a>.</td></tr><tr><td><code>@Inclusive</code></td><td>Boolean</td><td align="center">1</td><td>Must be set to <code>TRUE</code>, as SiteConnect reports totals as inclusive of charges and extras.</td></tr><tr><td><code>@Quantity</code></td><td>Integer</td><td align="center">1</td><td>Number of units included in the charge. This value does not affect the total amount.</td></tr><tr><td><code>@ServiceRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>Service</code> to a <code>RoomStay</code> or <code>RatePlan</code>. <code>ServiceRPH</code> absence indicates a HotelReservation-level charge.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">0..1</td><td>A reference to the type of object defined by the UniqueID element. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#unique-id-type-uit">OpenTravel Code List Unique ID Type (UIT)</a>.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Reference ID for the extra/service provided by the source booking channel.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">0..1</td><td>Used to identify the source of the identifier (e.g., IATA, ABTA).</td></tr><tr><td><code>Price</code></td><td>Element</td><td align="center">0..99</td><td>Container for pricing details of the service.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">0..1</td><td>The total amount charged for this rate including additional occupant amounts and fees.The total amount charged for the service including additional amounts and fees.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount not including any associated tax. At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>The total amount including any associated tax. At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a detailed description of the tax.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>Container for the total amount of the service.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>A monetary amount.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..99</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..5</td><td>Text description of the taxes in a given language</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>ServiceDetails</code></td><td>Element</td><td align="center">0..1</td><td>Container for additional service details.</td></tr><tr><td><code>GuestCounts</code></td><td>Element</td><td align="center">0..1</td><td>A collection of Guest Counts associated to the whole Reservation or a particular Room Stay or Service.</td></tr><tr><td><code>GuestCount</code></td><td>Element</td><td align="center">0..99</td><td>A recurring element that identifies the number of guests and ages of the guests.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">0..1</td><td>A code representing a business rule that determines the charges for a guest based upon age range (e.g. Adult, Child, Senior, Child With Adult, Child Without Adult). This attribute allows for an increase in rate by occupant class. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#age-qualifying-code-aqc">OpenTravel Code List Age Qualifying Code (AQC)</a>.</td></tr><tr><td><code>@Age</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the age of a guest.</td></tr><tr><td><code>@Count</code></td><td>Integer</td><td align="center">0..1</td><td>The number of guests in one AgeQualifyingCode or Count. Valid value between 1 and 9999.</td></tr><tr><td><code>@AgeBucket</code></td><td>String</td><td align="center">0..1</td><td>This defines the age range category or bucket into which a guest can be booked. It is typically used in conjunction with the age qualifying code to further define the applicable age range.</td></tr><tr><td><code>TimeSpan</code></td><td>Element</td><td align="center">0..1</td><td>Contains the time span for which the service is provided.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">0..1</td><td>The starting value of the time span.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">0..1</td><td>The ending value of the time span.</td></tr><tr><td><code>Comments</code></td><td>Element</td><td align="center">0..1</td><td>A collection of Comment objects. Comments which apply to the Service.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">0..n</td><td>Comment details.</td></tr><tr><td><code>@GuestViewable</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, the comment may be shown to the consumer. When false, it may not be.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..n</td><td>Service detail comments</td></tr><tr><td><code>ServiceDescription</code></td><td>Element</td><td align="center">0..1</td><td>Description of the service</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..n</td><td>A text description of the service</td></tr><tr><td><code>ServiceCategory</code></td><td>Element</td><td align="center">0..n</td><td>Hotel systems often group multiple services into a single category. This refers to the category specific to the hotel CRS/PMS.</td></tr><tr><td><code>@ServiceCategoryCode</code></td><td>String</td><td align="center">1</td><td>The representation of the specific service category for the service being reserved.</td></tr></tbody></table>

### **BillingInstructionCode**

```xml
<BillingInstructionCode BillingCode="385H45991" AccountNumber="WOOLF05301300" Start="2017-12-01" End="2017-12-03" AuthorizationCode="7985" Description="Please follow billing instructions for Platinum Membership.">
	<ResGuestRPH RPH="1"/>
</BillingInstructionCode>
```

<table><thead><tr><th width="223">Element / @Attribute</th><th width="106">Type</th><th width="72">M</th><th>Description</th></tr></thead><tbody><tr><td><code>BillingInstructionCode</code></td><td>Element</td><td>0..n</td><td>Billing codes apply to a set of instructions for a set of transactions that are routed to a designated folio.</td></tr><tr><td><code>@BillingCode</code></td><td>String</td><td>1</td><td>The individual billing code that applies to a set of instructions that are routed to a designated folio.</td></tr><tr><td><code>@AccountNumber</code></td><td>String</td><td>0..1</td><td>Identifies the account number where the charges will be routed.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td>0..1</td><td>The starting value of the time span.</td></tr><tr><td><code>@End</code></td><td>Date</td><td>0..1</td><td>The ending value of the time span.</td></tr><tr><td><code>@AuthorizationCode</code></td><td>Integer</td><td>0..1</td><td>The authorization code associated with the billing code.</td></tr><tr><td><code>@Description</code></td><td>String</td><td>0..1</td><td>A short description of the billing code or instructions.</td></tr><tr><td><code>ResGuestRPH</code></td><td>Element</td><td>0..1</td><td>A reference to a guest ID object that may be defined in ResGuests/ResGuest</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td>0..1</td><td>A unique reference to the guest ID.</td></tr></tbody></table>

### ResGuests

```xml
<ResGuests>
	<ResGuest ResGuestRPH="1" AgeQualifyingCode="10" ArrivalTime="13:30:00" PrimaryIndicator="true" Age="51">
		<Profiles>
			<ProfileInfo>
				<UniqueID Type="1" ID="8943112" ID_Context="PROPERTY"/>
				<Profile ProfileType="1" ShareAllOptOutInd="true" ShareAllMarketInd="false">
					<Customer VIP_Indicator="true" CustomerValue="Platinum" BirthDate="1966-07-16">
						<PersonName NameType="2" Language="en">
							<NamePrefix>Mrs.</NamePrefix>
							<GivenName>Ginny</GivenName>
							<MiddleName>Adeline</MiddleName>
							<Surname>Woolf</Surname>
							<NameSuffix>Jr.</NameSuffix>
							<NameTitle>Ph.D.</NameTitle>
						</PersonName>
						<Telephone PhoneLocationType="10" PhoneTechType="5" CountryAccessCode="61" AreaCityCode="4" PhoneNumber="13855956" Remark="Active" FormattedInd="false" DefaultInd="true"/>
						<Email DefaultInd="true" EmailType="1">Virginia.Woolf@hotmail.com</Email>
						<Address Type="2">
							<AddressLine>125 Pitt Street</AddressLine>
							<CityName>Sydney</CityName>
							<PostalCode>2000</PostalCode>
							<StateProv StateCode="NSW">New South Wales</StateProv>
							<CountryName Code="AU">Australia</CountryName>
							<CompanyName Code="DLW">Dalloway</CompanyName>
						</Address>
						<CustLoyalty ProgramID="PLATINUM5+5" MembershipID="8943112" LoyalLevel="VIP" LoyalLevelCode="10" SignupDate="2014-08-08" EffectiveDate="2014-08-08" ExpireDate="2024-08-08" Remark="5+5 DEAL (Sign up for 5 years of Platinum membership, get another 5 years for free)"/>
					</Customer>
					<!-- Additional ResGuest elements -->
				</Profile>
			</ProfileInfo>
		</Profiles>
	</ResGuest>
</ResGuests>
```

<table><thead><tr><th width="192">Element / @Attribute</th><th width="116">Type</th><th width="77" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>ResGuests</code></td><td>Element</td><td align="center">0..1</td><td>Contains the guests for the reservation.</td></tr><tr><td><code>ResGuest</code></td><td>Element</td><td align="center">1..n</td><td>Contains the specific guest details.</td></tr><tr><td><code>@ResGuestRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>ResGuest</code> to <code>RoomStay</code>. Find the links in <a href="#resguestrphs">ResGuestRPHs</a>.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">0..1</td><td>A code representing a business rule that determines the charges for a guest based upon age range (e.g. Adult, Child, Senior, Child With Adult, Child Without Adult). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#age-qualifying-code-aqc">OpenTravel Code List Age Qualifying Code (AQC)</a>.</td></tr><tr><td><code>@ArrivalTime</code></td><td>Time</td><td align="center">0..1</td><td>Arrival time of the guest.</td></tr><tr><td><code>@PrimaryIndicator</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, indicates this is the primary guest. Only one ResGuest can be the primary guest.</td></tr><tr><td><code>@Age</code></td><td>Integer</td><td align="center">0..1</td><td>The age of the guest.</td></tr><tr><td><code>Profiles</code></td><td>Element</td><td align="center">0..1</td><td>Contains the guest profile information.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td align="center">1..n</td><td>Contains the profile information for the guest.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">0..9</td><td>A unique ID for a profile. This element can repeat to accommodate multiple unique IDs for a single profile across multiple systems.</td></tr><tr><td><code>@ID</code></td><td>Integer</td><td align="center">1</td><td>A unique identifying value assigned by the creating system. The ID attribute may be used to reference a primary-key value within a database or in a particular implementation.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>A reference to the type of object defined by the UniqueID element. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#unique-id-type-uit">OpenTravel Code List Unique ID Type (UIT)</a>.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">0..1</td><td>Used to identify the source of the identifier.</td></tr><tr><td><code>Profile</code></td><td>Element</td><td align="center">1</td><td>Contains detailed customer profile information.</td></tr><tr><td><code>@ProfileType</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>1</code> (Customer).</td></tr><tr><td><code>@ShareAllOptOutInd</code></td><td>Boolean</td><td align="center">1</td><td>Customer has 'opted out' of receiving marking information (Non EU).</td></tr><tr><td><code>@ShareAllMarketInd</code></td><td>Boolean</td><td align="center">1</td><td>Customer has 'opted in' to receive marking information (EU Customers).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td align="center">0..1</td><td>Contains detailed guest information.</td></tr><tr><td><code>@VIP_Indicator</code></td><td>Boolean</td><td align="center">0..1</td><td>If true, indicates a very important person.</td></tr><tr><td><code>@CustomerValue</code></td><td>String</td><td align="center">0..1</td><td>The supplier's ranking of the customer (e.g., VIP, numerical ranking).</td></tr><tr><td><code>@BirthDate</code></td><td>Date</td><td align="center">0..1</td><td>The customer’s birthday information.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">0..1</td><td>Contains the name information for the guest.</td></tr><tr><td><code>@Language</code></td><td>String</td><td align="center">0..1</td><td>The language code for which the name data is represented.</td></tr><tr><td><code>@NameType</code></td><td>Integer</td><td align="center">0..1</td><td>Former, Nickname, Alternate, etc. Please refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#name-type-nam">OpenTravel Code List Name Type (NAM)</a>.</td></tr><tr><td><code>NamePrefix</code></td><td>Element</td><td align="center">0..3</td><td>Title of the guest.</td></tr><tr><td><code>GivenName</code></td><td>Element</td><td align="center">0..5</td><td>First name of the guest.</td></tr><tr><td><code>MiddleName</code></td><td>Element</td><td align="center">0..3</td><td>The middle name of the person name.</td></tr><tr><td><code>Surname</code></td><td>Element</td><td align="center">1</td><td>Last name of the guest.</td></tr><tr><td><code>NameSuffix</code></td><td>Element</td><td align="center">0..3</td><td>Name suffixes and letters (e.g. Jr., Sr., III, Ret., Esq.)</td></tr><tr><td><code>NameTitle</code></td><td>Element</td><td align="center">0..5</td><td>Degree or honours (e.g., Ph.D., M.D.)</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..5</td><td>Contains telephone information related to the guest. Max 5 per reservation.</td></tr><tr><td><code>@PhoneLocationType</code></td><td>Integer</td><td align="center">0..1</td><td>Describes the location of the phone, such as Home, Office, Property Reservation Office, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#phone-location-type-plt">OpenTravel Code List Phone Location Type (PLT)</a>.</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td align="center">0..1</td><td>Indicates type of technology associated with this telephone number, such as Voice, Data, Fax, Pager, Mobile, TTY, etc. Refer to OpenTravel Code List Phone Technology Type (PTT).</td></tr><tr><td><code>@CountryAccessCode</code></td><td>Integer</td><td align="center">0..1</td><td>Code assigned by telecommunications authorities for international country access identifier.</td></tr><tr><td><code>@AreaCityCode</code></td><td>Integer</td><td align="center">0..1</td><td>Code assigned for telephones in a specific region, city, or area.</td></tr><tr><td><code>@PhoneNumber</code></td><td>Integer</td><td align="center">0..1</td><td>Telephone number assigned to a single location.</td></tr><tr><td><code>@Remark</code></td><td>String</td><td align="center">0..1</td><td>A remark associated with the telephone number.</td></tr><tr><td><code>@FormattedInd</code></td><td>Boolean</td><td align="center">0..1</td><td>Specifies if the associated data is formatted or not. When true, then it is formatted; when false, then not formatted.</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..5</td><td>Contact email address. Max 5 per reservation.</td></tr><tr><td><code>@EmailType</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the purpose of the e-mail address (e.g. personal, business, listserve). Refer to OpenTravel Code List Email Address Type (EAT).</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td align="center">0..5</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..5</td><td>Address information of the guest.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the type of address (e.g. home, business, other). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#communication-location-type-clt">OpenTravel Code List Communication Location Type (CLT)</a>.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td align="center">0..5</td><td>Address lines for the guest.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td align="center">0..1</td><td>City of residence.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td align="center">0..1</td><td>Postal code.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td align="center">0..1</td><td>State or province name.</td></tr><tr><td><code>@StateCode</code></td><td>String</td><td align="center">0..1</td><td>The standard code or abbreviation for the state, province, or region.</td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">0..1</td><td>Identifies a company.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>ISO 3166 code for a country.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td align="center">0..1</td><td>Country name (maximum 64 characters).</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>ISO 3166 code for a country.</td></tr><tr><td><code>CustLoyalty</code></td><td>Element</td><td align="center">0..25</td><td>Loyalty program information for the customer.</td></tr><tr><td><code>@ProgramID</code></td><td>String</td><td align="center">0..1</td><td>The ProgramID attribute can be used to indicate the program that is being passed. For instance, we could use it to pass: Frequent Guest, Frequent Traveller and Company ID.</td></tr><tr><td><code>@MembershipID</code></td><td>Integer</td><td align="center">0..1</td><td>The membershipID attribute will indicate the actual number.</td></tr><tr><td><code>@LoyalLevel</code></td><td>String</td><td align="center">0..1</td><td>Indicates special privileges in the program assigned to an individual.</td></tr><tr><td><code>@LoyalLevelCode</code></td><td>Integer</td><td align="center">0..1</td><td>Provides a numeric code assigned to a particular loyalty level.</td></tr><tr><td><code>@SignupDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date of the program.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the expiration date of the program.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the customer’s sign-up date.</td></tr><tr><td><code>@Remark</code></td><td>String</td><td align="center">0..1</td><td>A remark associated with the customer's loyalty program.</td></tr><tr><td><code>CompanyInfo</code></td><td>Element</td><td align="center">0..1</td><td>Detailed information about a company.</td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">0..1</td><td>Identifies a company by name.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Identifies a company by the company code.</td></tr><tr><td><code>AddressInfo</code></td><td>Element</td><td align="center">0..5</td><td></td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the type of address (e.g. home, business, other). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#communication-location-type-clt">OpenTravel Code List Communication Location Type (CLT)</a>.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td align="center">0..5</td><td>These lines will contain free-form address details.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td align="center">0..1</td><td>City (e.g., Dublin), town, or postal station.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td align="center">0..1</td><td>State, province, or region name.</td></tr><tr><td><code>@StateCode</code></td><td>String</td><td align="center">0..1</td><td>The standard code or abbreviation for the state, province, or region.</td></tr><tr><td><code>PostalCode</code></td><td>String</td><td align="center">0..1</td><td>Post Office Code number.</td></tr><tr><td><code>CountryName</code></td><td>String</td><td align="center">0..1</td><td>Country name (e.g., Ireland).</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>ISO 3166 code for a country.</td></tr><tr><td><code>TelephoneInfo</code></td><td>Element</td><td align="center">0..n</td><td>Information on a telephone number for the company.</td></tr><tr><td><code>@PhoneLocationType</code></td><td>Integer</td><td align="center">0..1</td><td>Describes the location of the phone, such as Home, Office, Property Reservation Office, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#phone-location-type-plt">OpenTravel Code List Phone Location Type (PLT)</a>.</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td align="center">0..1</td><td>Indicates type of technology associated with this telephone number, such as Voice, Data, Fax, Pager, Mobile, TTY, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#phone-technology-type-ptt">OpenTravel Code List Phone Technology Type (PTT)</a>.</td></tr><tr><td><code>@CountryAccessCode</code></td><td>Integer</td><td align="center">0..1</td><td>Code assigned by telecommunications authorities for international country access identifier.</td></tr><tr><td><code>@AreaCityCode</code></td><td>Integer</td><td align="center">0..1</td><td>Code assigned for telephones in a specific region, city, or area.</td></tr><tr><td><code>@PhoneNumber</code></td><td>Integer</td><td align="center">1</td><td>Telephone number assigned to a single location.</td></tr><tr><td><code>@FormattedInd</code></td><td>Boolean</td><td align="center">0..1</td><td>Specifies if the associated data is formatted or not. When true, then it is formatted; when false, then not formatted.</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>@Remark</code></td><td>String</td><td align="center">0..1</td><td>A remark associated with the telephone number.</td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..5</td><td>Information on an email address for the company.</td></tr><tr><td><code>@EmailType</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the purpose of the e-mail address (e.g. personal, business, listserve). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#email-address-type-eat">OpenTravel Code List Email Address Type (EAT)</a>.</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>ContactPerson</code></td><td>Element</td><td align="center">0..n</td><td>Information on a contact person for the company. Name of an individual and appropriate contact information. May be contact information for the customer or someone affiliated with the customer.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">0..1</td><td></td></tr><tr><td><code>@Language</code></td><td>String</td><td align="center">0..1</td><td>The language code for which the name data is represented.</td></tr><tr><td><code>@NameType</code></td><td>Integer</td><td align="center">0..1</td><td>Former, Nickname, Alternate, etc. Please refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#name-type-nam">OpenTravel Code List Name Type (NAM)</a>.</td></tr><tr><td><code>NamePrefix</code></td><td>Element</td><td align="center">0..3</td><td>Salutation of honorific (e.g. Mr., Mrs., Ms., Miss, Dr.)</td></tr><tr><td><code>GivenName</code></td><td>Element</td><td align="center">0.5</td><td>Given name, first name or names.</td></tr><tr><td><code>MiddleName</code></td><td>Element</td><td align="center">0..3</td><td>The middle name of the person name.</td></tr><tr><td><code>Surname</code></td><td>Element</td><td align="center">1</td><td>Family or last name.</td></tr><tr><td><code>NameSuffix</code></td><td>Element</td><td align="center">0..3</td><td>Name suffixes and letters (e.g. Jr., Sr., III, Ret., Esq.)</td></tr><tr><td><code>NameTitle</code></td><td>Element</td><td align="center">0..5</td><td>Degree or honours (e.g., Ph.D., M.D.)</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..5</td><td>Information on a telephone number for the customer. Max 5 per reservation.</td></tr><tr><td><code>@PhoneLocationType</code></td><td>Integer</td><td align="center">0..1</td><td>Describes the location of the phone, such as Home, Office, Property Reservation Office, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#phone-location-type-plt">OpenTravel Code List Phone Location Type (PLT)</a>.</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td align="center">0..1</td><td>Indicates the type of technology associated with this telephone number, such as Voice, Data, Fax, Pager, Mobile, TTY, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#phone-technology-type-ptt">OpenTravel Code List Phone Technology Type (PTT)</a>.</td></tr><tr><td><code>@CountryAccessCode</code></td><td>Integer</td><td align="center">0..1</td><td>Code assigned by telecommunications authorities for international country access identifier.</td></tr><tr><td><code>@AreaCityCode</code></td><td>Integer</td><td align="center">0..1</td><td>Code assigned for telephones in a specific region, city, or area.</td></tr><tr><td><code>@PhoneNumber</code></td><td>Integer</td><td align="center">1</td><td>Telephone number assigned to a single location.</td></tr><tr><td><code>@FormattedInd</code></td><td>Boolean</td><td align="center">0..1</td><td>Specifies if the associated data is formatted or not. When true, then it is formatted; when false, then not formatted.</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>@Remark</code></td><td>String</td><td align="center">0..1</td><td>A remark associated with the telephone number.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..5</td><td>Detailed information on an address for the contact person for the company.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the type of address (e.g. home, business, other). Refer to OpenTravel <a href="/pages/IG8dKV52Ty9x3QCHTV1x#communication-location-type-clt">Code List Communication Location Type (CLT)</a>.</td></tr><tr><td><code>AddressLine</code></td><td>String</td><td align="center">0..5</td><td>These lines will contain free-form address details.</td></tr><tr><td><code>CityName</code></td><td>String</td><td align="center">0..1</td><td>City (e.g., Dublin), town, or postal station.</td></tr><tr><td><code>StateProv</code></td><td>String</td><td align="center">0..1</td><td>State, province, or region name.</td></tr><tr><td><code>@StateCode</code></td><td>String</td><td align="center">0..1</td><td>The standard code or abbreviation for the state, province, or region.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td align="center">0..1</td><td>Post Office Code number.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td align="center">0..1</td><td>Country name (e.g., Ireland).</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>ISO 3166 code for a country.</td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..5</td><td>Information on an email address for the contact person for the company. Max 5 per reservation.</td></tr><tr><td><code>@EmailType</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the purpose of the e-mail address (e.g. personal, business, listserve). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#email-address-type-eat">OpenTravel Code List Email Address Type (EAT)</a>.</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>SpecialRequests</code></td><td>Element</td><td align="center">0..1</td><td></td></tr><tr><td><code>SpecialRequest</code></td><td>Element</td><td align="center">1..n</td><td>The SpecialRequest object indicates special requests for a particular guest, service or reservation.</td></tr><tr><td><code>@RequestCode</code></td><td>String</td><td align="center">0..1</td><td>This identifies a special request for this reservation and is typically hotel-specific.</td></tr><tr><td><code>@CodeContext</code></td><td>String</td><td align="center">0..1</td><td>Identifies the source authority for the RequestCode.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..1</td><td>Provides more information about the request code or describes requests that are yet uncoded.</td></tr><tr><td><code>Comments</code></td><td>Element</td><td align="center">0..1</td><td>Comment section relating to the ResGuest.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1</td><td>Comment details.</td></tr><tr><td><code>@GuestViewable</code></td><td>Boolean</td><td align="center">1</td><td>This indicates that the comment can be seen by the guest and is necessary when two different types of comments are passed: one which is guest-viewable and one that isn’t.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Textual description of Comments.</td></tr><tr><td><code>ServiceRPHs</code></td><td>Element</td><td align="center">0..1</td><td></td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">1..n</td><td>This is a reference placeholder used as an index for a service to be associated with this guest.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Services ID</td></tr><tr><td><code>ArrivalTransport</code></td><td>Element</td><td align="center">0..1</td><td>Contains information about the arrival transportation for a guest</td></tr><tr><td><code>TransportInfo</code></td><td>Element</td><td align="center">1..n</td><td>Indicates transportation information for a guest.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">0..1</td><td>Method of conveyance of this guest. Values: Air, Rail, Bus, Boat, Private Auto, Other.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Identifier of this transportation method (e.g., flight number).</td></tr><tr><td><code>@Time</code></td><td>DateTime</td><td align="center">0..1</td><td>Time of transportation. The local time of the location, indicated by the LocationCode.</td></tr><tr><td><code>DepartureTransport</code></td><td>Element</td><td align="center">0..1</td><td>Contains information about the departure transportation for a guest</td></tr><tr><td><code>TransportInfo</code></td><td>Element</td><td align="center">1..n</td><td>Indicates transportation information for a guest.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">0..1</td><td>Method of conveyance of this guest. Values: Air, Rail, Bus, Boat, Private Auto, Other.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Identifier of this transportation method (e.g., flight number).</td></tr><tr><td><code>@Time</code></td><td>DateTime</td><td align="center">0..1</td><td>Time of transportation. The local time of the location, indicated by the LocationCode.</td></tr></tbody></table>

### ResGlobalInfo

```xml
<ResGlobalInfo>
	<!-- ... other elements and attributes have been omitted for brevity ... -->
	<TimeSpan Start="2026-12-01" End="2026-12-02"/>
	<Total AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD"/>
	<HotelReservationIDs>
		<HotelReservationID ResID_Type="14" ResID_Value="ABC-123456789"/>
		<HotelReservationID ResID_Type="34" ResID_Value="35580193-d1b0-45a4-af37-d9ac0452dcfc"/>
	</HotelReservationIDs>
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGlobalInfo>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="130.08203125">Type</th><th width="81.12890625" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>ResGlobalInfo</code></td><td>Element</td><td align="center">1</td><td>Contains global information about the reservation.</td></tr><tr><td><code>GuestCounts</code></td><td>Element</td><td align="center">0..1</td><td></td></tr><tr><td><code>GuestCount</code></td><td>Element</td><td align="center">1..99</td><td>A recurring element that identifies the number of guests and ages of the guests.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">0..1</td><td>A code representing a business rule that determines the charges for a guest based upon age range (e.g. Adult, Child, Senior, Child With Adult, Child Without Adult). This attribute allows for an increase in rate by occupant class. Refer to OpenTravel Code List Age Qualifying Code (AQC).</td></tr><tr><td><code>@Age</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the age of a guest.</td></tr><tr><td><code>@Count</code></td><td>Integer</td><td align="center">0..1</td><td>The number of guests in one AgeQualifyingCode or Count.<br>Valid value between 1 and 9999.</td></tr><tr><td><code>@AgeBucket</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the age range category or bucket a guest can be booked into. This is typically used in conjunction with the age qualifying code to further define the applicable age range.</td></tr><tr><td><code>Timespan</code></td><td>Element</td><td align="center">1</td><td>The Time Span which covers the Reservation</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>The ending value of the time span (Check in date)</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>The starting value of the time span (Check out date)</td></tr><tr><td><code>Memberships</code></td><td>Element</td><td align="center">0..1</td><td>A collection of Membership objects. Memberships provides a list of reward progream which may be credited with points accrued from the guest's activity.</td></tr><tr><td><code>Membership</code></td><td>Integer</td><td align="center">0..n</td><td>The Membership object identifes the frequent customer reward program.</td></tr><tr><td><code>@ProgramCode</code></td><td>Integer</td><td align="center">0..1</td><td>The code or name of the membership program ('Hertz', 'AAdvantage', etc.).</td></tr><tr><td><code>@AccountID</code></td><td>Integer</td><td align="center">0..1</td><td>The account identification number for this particular member in this particular program.</td></tr><tr><td><code>Comments</code></td><td>String</td><td align="center">0..1</td><td>A collection of Comment objects. Comments which apply to the Service.</td></tr><tr><td><code>Comment</code></td><td>String</td><td align="center">0..n</td><td>Comment details.</td></tr><tr><td><code>@GuestViewable</code></td><td>Boolean</td><td align="center">0..1</td><td>When true, the comment may be shown to the consumer. When false, the comment may not be shown to the consumer.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">0..n</td><td>Reservation comments</td></tr><tr><td><code>SpecialRequests</code></td><td>String</td><td align="center">0..1</td><td></td></tr><tr><td><code>SpecialRequest</code></td><td>String</td><td align="center">1..n</td><td>The SpecialRequest object indicates special requests for a particular guest, service or reservation.</td></tr><tr><td><code>@RequestCode</code></td><td>String</td><td align="center">1..n</td><td>This identifies a special request for this reservation and is typically hotel-specific.</td></tr><tr><td><code>@CodeContext</code></td><td>String</td><td align="center">0..1</td><td>Identifies the source authority for the RequestCode.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">0..n</td><td>Provides more information about the request code or provides description for requests that are yet uncoded.</td></tr><tr><td><code>Guarantee</code></td><td>Element</td><td align="center">0..5</td><td>The guarantee information to hold a reservation</td></tr><tr><td><code>@GuaranteeCode</code></td><td>String</td><td align="center">0..1</td><td>Guarantee Code</td></tr><tr><td><code>@GuaranteeType</code></td><td>String</td><td align="center">0..1</td><td><p>An enumerated type defining the guarantee to be applied to this reservation.</p><p><strong>Value:</strong><br>CC/DC/Voucher<br>Deposit<br>DepositRequired<br>GuaranteeRequired<br>None<br>PrePay<br>Profile</p></td></tr><tr><td><code>GuaranteesAccepted</code></td><td>Element</td><td align="center">0..1</td><td>The guarantee information associated to the reservation. A maximum of 5 occurances are available for use depending on the context.</td></tr><tr><td><code>GuaranteeAccepted</code></td><td>Element</td><td align="center">1..n</td><td>Guarantee Detail.</td></tr><tr><td><code>@PaymentTransactionTypeCode</code></td><td>Enumeration</td><td align="center">0..1</td><td><p>This is used to indicate either a charge, reserve (deposit) or refund.</p><p>charge: This indicates that an actual payment has been made.</p><p>refund: This indicates that the payment amount of this PaymentDetail element is for a refund.</p><p>reserve: This indicates that a hold for the indicated amount has been placed on a credit card or that a cash amount has been taken from the customer to guarantee final payment.<br></p></td></tr><tr><td><code>PaymentCard</code></td><td>Integer</td><td align="center">0..1</td><td><p>Specific payment card information. Details of a debit or credit card.</p><p><strong>NOTE:</strong> PCI sensitive information is out of scope in Payment card. Please do not attempt to parse any 'out of scope' elements / data</p></td></tr><tr><td><code>@CardCode</code></td><td>Integer</td><td align="center">0..1</td><td>Issuer code. See OTA Payment Card Provider Codes</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the ending date.</td></tr><tr><td><code>CardHolderName</code></td><td>String</td><td align="center">0..1</td><td></td></tr><tr><td><code>CardNumber</code></td><td>Integer</td><td align="center">0..1</td><td>Secure information that supports PCI tokens, data masking and other encryption methods.</td></tr><tr><td><code>@Mask</code></td><td>Integer</td><td align="center">0..1</td><td>Masked data.</td></tr><tr><td><code>@Token</code></td><td>Integer</td><td align="center">0..1</td><td>Tokenized information.</td></tr><tr><td><code>@TokenProviderID</code></td><td>String</td><td align="center">0..1</td><td>Provider ID.</td></tr><tr><td><code>Voucher</code></td><td>Element</td><td align="center">0..1</td><td>Details of a paper or electronic document indicating prepayment.</td></tr><tr><td><code>@SeriesCode</code></td><td>Integer</td><td align="center">0..1</td><td>Identification of a series of coupons or vouchers identified by serial number(s).</td></tr><tr><td><code>DirectBill</code></td><td>Element</td><td align="center">0..1</td><td>Details of a direct billing arrangement.</td></tr><tr><td><code>@DirectBill_ID</code></td><td>Integer</td><td align="center">0..1</td><td>Identifier for the organization to be billed directly for travel services.</td></tr></tbody></table>

### **Guarantee**

```xml
<Guarantee GuaranteeCode="COMBINED_GUARANTEE" GuaranteeType="DepositRequired">
	<GuaranteesAccepted>
		<GuaranteeAccepted PaymentTransactionTypeCode="charge">
			<PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720">
				<CardHolderName>Leonard Woolf</CardHolderName>
				<CardNumber Mask="4021XXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber>
			</PaymentCard>
		</GuaranteeAccepted>
		<GuaranteeAccepted PaymentTransactionTypeCode="charge">
			<Voucher SeriesCode="4555"/>
		</GuaranteeAccepted>
		<GuaranteeAccepted PaymentTransactionTypeCode="charge">
			<DirectBill DirectBill_ID="4981003"/>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
	<GuaranteeDescription>
		<Text>Combined Guarantees Accepted (Platinum Membership)</Text>
	</GuaranteeDescription>
</Guarantee>
```

<table><thead><tr><th width="274">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Guarantee</code></td><td>Element</td><td align="center">0..1</td><td>Guarantee provided with the reservation. Used if no deposit is paid for the reservation.</td></tr><tr><td><code>@GuaranteeCode</code></td><td>String</td><td align="center">0..1</td><td>Guarantee Code</td></tr><tr><td><code>@GuaranteeType</code></td><td>String</td><td align="center">0..1</td><td><p>An enumerated type defining the guarantee to be applied to this reservation.</p><p><strong>Value:</strong><br>CC/DC/Voucher<br>Deposit<br>DepositRequired<br>GuaranteeRequired<br>None<br>PrePay<br>Profile</p></td></tr><tr><td><code>GuaranteesAccepted</code></td><td>Element</td><td align="center">0..1</td><td>Contains the details of accepted guarantees.</td></tr><tr><td><code>GuaranteeAccepted</code></td><td>Element</td><td align="center">1..n</td><td>Specific details of the accepted guarantee.</td></tr><tr><td><code>@PaymentTransactionTypeCode</code></td><td>String</td><td align="center">0..1</td><td><p><code>charge</code> - This indicates that an actual payment has been made.</p><p><code>refund</code> - This indicates that the payment amount of this PaymentDetail element is for a refund.</p><p><code>reserve</code> <strong>-</strong> This indicates that a hold for the indicated amount has been placed on a credit card or that a cash amount has been taken from the customer to guarantee final payment.</p></td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">0..1</td><td>Details of the payment card used for the guarantee.</td></tr><tr><td><code>@CardType</code></td><td>String</td><td align="center">0..1</td><td>Must be set to <code>1</code> (Credit Card).</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">0..1</td><td>2-character code of the credit card issuer. Refer to <a href="/pages/Iqs1qAbBKAcBqhyyZHQt">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>String</td><td align="center">0..1</td><td>Indicates the starting date (format <code>MMyy</code>).</td></tr><tr><td><code>@ExpireDate</code></td><td>String</td><td align="center">0..1</td><td>Expiry date of the credit card (format <code>MMyy</code>).</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td align="center">0..1</td><td>Name of the cardholder.</td></tr><tr><td><code>CardNumber</code></td><td>Integer</td><td align="center">0..1</td><td>Secure information that supports PCI tokens, data masking and other encryption methods.</td></tr><tr><td><code>@Mask</code></td><td>String</td><td align="center">0..1</td><td>Masked data.</td></tr><tr><td><code>@Token</code></td><td>Integer</td><td align="center">0..1</td><td>Tokenized information.</td></tr><tr><td><code>@TokenProviderID</code></td><td>String</td><td align="center">0..1</td><td>Provider ID.</td></tr><tr><td><code>Voucher</code></td><td>Element</td><td align="center">0..1</td><td>Details of a paper or electronic document indicating prepayment.</td></tr><tr><td><code>@SeriesCode</code></td><td>Integer</td><td align="center">0..1</td><td>Identification of a series of coupons or vouchers identified by serial number(s).</td></tr><tr><td><code>DirectBill</code></td><td>Element</td><td align="center">0..1</td><td>Details of a direct billing arrangement.</td></tr><tr><td><code>@DirectBill_ID</code></td><td>Integer</td><td align="center">0..1</td><td>Identifier for the organization to be billed directly for travel services.</td></tr></tbody></table>

### **DepositPayments**

{% tabs %}
{% tab title="Credit Card " %}

```xml
<DepositPayments>
	<GuaranteePayment>
		<AcceptedPayments>
			<AcceptedPayment PaymentTransactionTypeCode="charge">
				<PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720">
					<CardHolderName>Leonard Woolf</CardHolderName>
					<CardNumber Mask="4021XXXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber>
				</PaymentCard>
			</AcceptedPayment>
		</AcceptedPayments>
		<AmountPercent Percent="30" CurrencyCode="AUD" Amount="76.67" NmbrOfNights="2">
			<Taxes CurrencyCode="AUD" Amount="1.53">
				<Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="2">
					<TaxDescription>
						<Text>Credit Card surcharge.</Text>
					</TaxDescription>
				</Tax>
			</Taxes>
		</AmountPercent>
		<Deadline AbsoluteDeadline="2017-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/>
		<Description>
			<Text>30% deposit (of the total reservation cost) will be charged to card holder's account 10 days before the date of arrival at the latest.</Text>
		</Description>
		<Address Type="1">
			<AddressLine>12 Pine Street</AddressLine>
			<CityName>Sydney</CityName>
			<PostalCode>2095</PostalCode>
			<StateProv StateCode="NSW">New South Wales</StateProv>
			<CountryName Code="AU">Australia</CountryName>
		</Address>
	</GuaranteePayment>
	<!-- Addition GuaranteePayment Elements -->
</DepositPayments>
```

{% endtab %}

{% tab title="Deposit Only" %}

```xml
<DepositPayments>
	<GuaranteePayment>
		<AmountPercent Amount="90.00" CurrencyCode="EUR"/>
	</GuaranteePayment>
</DepositPayments>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="270">Element / @Attribute</th><th width="112">Type</th><th width="65.8359375" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>DepositPayments</code></td><td>Element</td><td align="center">0..1</td><td>Deposit provided with the reservation.</td></tr><tr><td><code>GuaranteePayment</code></td><td>Element</td><td align="center">1</td><td>Contains details of the payment guarantee for the reservation.</td></tr><tr><td><code>AcceptedPayments</code></td><td>Element</td><td align="center">0..1</td><td>Contains the accepted payment methods.</td></tr><tr><td><code>AcceptedPayment</code></td><td>Element</td><td align="center">1</td><td>Specific payment method accepted.</td></tr><tr><td><code>@PaymentTransactionTypeCode</code></td><td>Enumeration</td><td align="center">0..1</td><td><p>This is used to indicate either a charge, reserve (deposit) or refund.</p><p>charge: This indicates that an actual payment has been made.</p><p>refund: This indicates that the payment amount of this PaymentDetail element is for a refund.</p><p>reserve: This indicates that a hold for the indicated amount has been placed on a credit card or that a cash amount has been taken from the customer to guarantee final payment.<br></p></td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">1</td><td>Details of the payment card used for the guarantee.</td></tr><tr><td><code>@CardType</code></td><td>String</td><td align="center">0..1</td><td>Must be set to <code>1</code> (Credit Card).</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">0..1</td><td>2-character code of the credit card issuer. Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/payment-card-provider-codes">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the ending date.</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td align="center">0..1</td><td>Name of the cardholder.</td></tr><tr><td><code>@CardNumber</code></td><td>String</td><td align="center">0..1</td><td>Actual credit card number.</td></tr><tr><td><code>@Mask</code></td><td>Integer</td><td align="center">0..1</td><td>Masked data.</td></tr><tr><td><code>@Token</code></td><td>Integer</td><td align="center">0..1</td><td>Tokenized information.</td></tr><tr><td><code>@TokenProviderID</code></td><td>String</td><td align="center">0..1</td><td>Provider ID.</td></tr><tr><td><code>Voucher</code></td><td>Element</td><td align="center">0..1</td><td>Details of a paper or electronic document indicating prepayment.</td></tr><tr><td><code>@SeriesCode</code></td><td>Integer</td><td align="center">0..1</td><td>Identification of a series of coupons or vouchers identified by serial number(s).</td></tr><tr><td><code>DirectBill</code></td><td>Integer</td><td align="center">0..1</td><td>Details of a direct billing arrangement.</td></tr><tr><td><code>@DirectBill_ID</code></td><td>Integer</td><td align="center">0..1</td><td>Identifier for the organization to be billed directly for travel services.</td></tr><tr><td><code>@AmountPercent</code></td><td>Integer</td><td align="center">0..1</td><td>Payment expressed as a fixed amount, or a percentage of/or room nights. If the the Total.amountAfterTax is provided, it will be a percentage of this value. If only the amountBeforeTax is provided it will be the percentage of this value. At least @Amount or @Percent will be populated.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>The percentage used to calculate the amount.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>A monetary amount taken for the deposit.</td></tr><tr><td><code>@NmbrOfNights</code></td><td>Integer</td><td align="center">1</td><td>The number of nights of the hotel stay that are used to calculate the fee amount.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>A collection of taxes relating to the deposit.</td></tr><tr><td><code>@CurrencyCode</code></td><td>Integer</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td></td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..99</td><td>An individual tax. This element allows for both percentages and flat amounts. If one field is used, the other should be zero since logically, taxes should be calculated in only one of the two ways.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code identifying the fee (e.g.,agency fee, municipality fee). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#fee-tax-type-ftt">OpenTravel Code List Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Integer</td><td align="center">0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>@CurrencyCode</code></td><td>Integer</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>Fee percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>Deadline</code></td><td>Element</td><td align="center">1</td><td>Payment deadline, absolute or relative.</td></tr><tr><td><code>@AbsoluteDeadline</code></td><td>DateTime</td><td align="center">1</td><td>Defines the absolute deadline. Either this or the offset attributes may be used.</td></tr><tr><td><code>@OffsetTimeUnit</code></td><td>String</td><td align="center">0..1</td><td>The units of time, e.g.: days, hours, etc., that apply to the deadline.</td></tr><tr><td><code>@OffsetUnitMultiplier</code></td><td>Integer</td><td align="center">0..1</td><td>The number of units of DeadlineTimeUnit.</td></tr><tr><td><code>@OffsetDropTime</code></td><td>String</td><td align="center">0..1</td><td>An enumerated type indicating when the deadline drop time goes into effect.</td></tr><tr><td><code>Description</code></td><td>Element</td><td align="center">0..1</td><td>Text description of the Payment in a given language.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..1</td><td>Textual information information relating to the payment.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..1</td><td>The address to which a deposit may be sent.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">0..1</td><td>Defines the type of address (e.g. home, business, other). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#communication-location-type-clt">OpenTravel Code List Communication Location Type (CLT)</a>.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td align="center">0..5</td><td>Address including any relevent street number.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td align="center">0..1</td><td>City (e.g., Dublin), town, or postal station (i.e., a postal service territory, often used in a military address).</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td align="center">0..1</td><td>Postal Code</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td align="center">0..1</td><td>State, province, or region name or code needed to identify location.</td></tr><tr><td><code>@StateCode</code></td><td>String</td><td align="center">0..1</td><td>The standard code or abbreviation for the state, province, or region.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td align="center">0..1</td><td>The name or code of a country (as used in an address).</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>ISO 3166 code for a country.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>A reference to the type of object defined by the UniqueID element. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#unique-id-type-uit">OpenTravel Code List Unique ID Type (UIT)</a>.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td align="center">0..1</td><td>Used to identify the source of the identifier.</td></tr></tbody></table>

### ReservationTotal

```xml
<Total AmountBeforeTax="217.00" AmountAfterTax="255.55" CurrencyCode="AUD">
	<Taxes CurrencyCode="AUD" Amount="38.55">
		<Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10">
			<TaxDescription>
				<Text>GST</Text>
			</TaxDescription>
		</Tax>
	</Taxes>
</Total>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>Total amount for the reservation. This includes all <code>RoomStays</code> and any additional fees or charges that apply.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>Integer</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>A monetary amount of tax.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Percent</code></td><td>Integer</td><td align="center">0..1</td><td>Fee percentage; if zero, assume use of the Amount attribute (Amount or Percent must be a zero value).</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..5</td><td>Text description of the taxes.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">0..n</td><td>Textual description of Discount Reason.</td></tr></tbody></table>

### HotelReservationIDs

{% tabs %}
{% tab title="PMS Reservation" %}
Contains only one `HotelReservationID` with `ResID_Type="14"` with the PMS reservation identifier. No other reservation IDs are present since the booking originates entirely within the property management system.

```xml
<HotelReservationIDs>
	<HotelReservationID ResID_Type="14" ResID_Value="1234567890" ResID_Source="PMSCODE"/>
</HotelReservationIDs>
```

{% endtab %}

{% tab title="Internet" %}
Contains two `HotelReservationID`: `ResID_Type="14"` for the PMS reservation identifier and `ResID_Type="29"` for the original booking reference from the external channel that sent the reservation directly to the PMS. In this case the `ResID_Source` must identify the specific booking channel code using our [PMS to SM Booking Agent Code List](broken://pages/XZmhGmBHt90cEfbyCdU7).

```xml
<HotelReservationIDs>
	<HotelReservationID ResID_Type="14" ResID_Value="1234567890" ResID_Source="PMSCODE"/>
	<HotelReservationID ResID_Type="29" ResID_Value="987654321" ResID_Source="DCC"/>
</HotelReservationIDs>
```

{% endtab %}

{% tab title="Other Booking Channel Types" %}
Contains two `HotelReservationID`: `ResID_Type="14"` for the PMS reservation identifier and `ResID_Type="29"` for the original booking reference from the source system (GDS confirmation, wholesaler booking ID, etc.).

```xml
<<HotelReservationIDs>
	<HotelReservationID ResID_Type="14" ResID_Value="1234567890" ResID_Source="PMSCODE"/>
	<HotelReservationID ResID_Type="29" ResID_Value="987654321" ResID_Source="SABRE"/>
</HotelReservationIDs>
```

{% endtab %}

{% tab title="SiteMinder Modification/Cancellation" %}
Contains two `HotelReservationID`: `ResID_Type="14"` for the PMS reservation identifier and `ResID_Type="25"` for the SiteMinder reservation reference that links back to the original channel booking previously distributed through SiteMinder.

```xml
<HotelReservationIDs>
	<HotelReservationID ResID_Type="14" ResID_Value="1234567890" ResID_Source="PMSCODE"/>
	<HotelReservationID ResID_Type="25" ResID_Value="ABC-1234567890" ResID_Source="SITEMINDER"/>
</HotelReservationIDs>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="242">Element / @Attribute</th><th width="103">Type</th><th width="74">M</th><th>Description</th></tr></thead><tbody><tr><td><code>HotelReservationIDs</code></td><td>Element</td><td>0..1</td><td>A collection of <code>HotelReservationID</code> objects for a given reservation.</td></tr><tr><td><code>HotelReservationID</code></td><td>Element</td><td>0..n</td><td>The <code>HotelReservationID</code> object contains various unique (reservation ID) and non unique (confirmation ID, cancellation ID) identifiers that the trading partners associate with a given reservation.</td></tr><tr><td><code>@ResID_Type</code></td><td>Integer</td><td>1</td><td><p><code>14</code> to identify the <code>ResID_Value</code> is the reservation ID from your PMS.</p><p><code>29</code> to identify the <code>ResID_Value</code> is the reservation ID from the Booking Channel.</p><p>For more information about the different <code>ResID_Type</code> Codes, refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#unique-id-type-uit">OpenTravel Code List (Unique ID Types)</a>.</p></td></tr><tr><td><code>@ResID_Value</code></td><td>String</td><td>1</td><td>This is the actual value associated with <code>ResID_Type</code></td></tr><tr><td><code>@ResID_Source</code></td><td>String</td><td>0..1</td><td>A unique identifier to indicate the source system which generated the <code>ResID_Value</code>.</td></tr></tbody></table>

### Profiles

```xml
<Profiles>
	<ProfileInfo>
		<UniqueID Type="1" ID="8943112" ID_Context="PROPERTY"/>
		<Profile ProfileType="1" ShareAllOptOutInd="true">
			<Customer VIP_Indicator="true" CustomerValue="Platinum" BirthDate="1966-07-16">
				<PersonName NameType="2" Language="en">
					<NamePrefix>Mrs.</NamePrefix>
					<GivenName>Ginny</GivenName>
					<MiddleName>Adeline</MiddleName>
					<Surname>Woolf</Surname>
					<NameSuffix>Jr.</NameSuffix>
					<NameTitle>Ph.D.</NameTitle>
				</PersonName>
				<Telephone PhoneLocationType="10" PhoneTechType="5" CountryAccessCode="61" AreaCityCode="4" PhoneNumber="13855956" Remark="Active" FormattedInd="false" DefaultInd="true"/>
				<Email DefaultInd="true" EmailType="1">Virginia.Woolf@hotmail.com</Email>
				<Address Type="2">
					<AddressLine>125 Pitt Street</AddressLine>
					<CityName>Sydney</CityName>
					<PostalCode>2000</PostalCode>
					<StateProv StateCode="NSW">New South Wales</StateProv>
					<CountryName Code="AU">Australia</CountryName>
					<CompanyName Code="DLW">Dalloway</CompanyName>
				</Address>
				<CustLoyalty ProgramID="PLATINUM5+5" MembershipID="8943112" LoyalLevel="VIP" LoyalLevelCode="10" SignupDate="2014-08-08" EffectiveDate="2014-08-08" ExpireDate="2024-08-08" Remark="5+5 DEAL (Sign up for 5 years of Platinum membership, get another 5 years for free)"/>
			</Customer>
			<CompanyInfo>
				<CompanyName Code="DLW">Dalloway</CompanyName>
				<AddressInfo Type="2">
					<AddressLine>88 Pall Mall</AddressLine>
					<CityName>London</CityName>
					<PostalCode>SW1Y 5ER</PostalCode>
					<StateProv StateCode="ENG">England</StateProv>
					<CountryName Code="UK">United Kingdom</CountryName>
				</AddressInfo>
				<TelephoneInfo PhoneLocationType="9" PhoneTechType="1" CountryAccessCode="44" AreaCityCode="20" PhoneNumber="23983039" Remark="Only active during business hours: 8AM-8PM BST" FormattedInd="false" DefaultInd="true"/>
				<Email DefaultInd="true" EmailType="2">info@dalloway.co.uk</Email>
				<ContactPerson>
					<PersonName NameType="3" Language="en-UK">
						<NamePrefix>Mr.</NamePrefix>
						<GivenName>Warren</GivenName>
						<MiddleName>Glass</MiddleName>
						<Surname>Smith</Surname>
						<NameSuffix>II</NameSuffix>
						<NameTitle>M.D.</NameTitle>
					</PersonName>
					<Telephone PhoneLocationType="10" PhoneTechType="5" CountryAccessCode="44" AreaCityCode="20" PhoneNumber="28596654" Remark="Active" FormattedInd="false" DefaultInd="true"/>
					<Address Type="2">
						<AddressLine>88 Pall Mall</AddressLine>
						<CityName>London</CityName>
						<PostalCode>SW1Y 5ER</PostalCode>
						<StateProv StateCode="ENG">England</StateProv>
						<CountryName Code="UK">United Kingdom</CountryName>
					</Address>
					<Email DefaultInd="true" EmailType="2">Phillip.Glass-Smith@dalloway.co.uk</Email>
				</ContactPerson>
			</CompanyInfo>
		</Profile>
	</ProfileInfo>
</Profiles>
```

<table><thead><tr><th width="230">Element / @Attribute</th><th width="116">Type</th><th width="63">M</th><th>Description</th></tr></thead><tbody><tr><td><code>Profiles</code></td><td>Element</td><td>0..1</td><td>Contains the profile information.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td>1..n</td><td>Contains the profiles.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td>0..9</td><td>A unique ID for a profile. This element can repeat to accommodate multiple unique IDs for a single profile across multiple systems.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td>1</td><td>A reference to the type of object defined by the UniqueID element. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#unique-id-type-uit">OpenTravel Code List Unique ID Type (UIT)</a>.</td></tr><tr><td><code>@ID</code></td><td>Integer</td><td>1</td><td>A unique identifying value assigned by the creating system. The ID attribute may be used to reference a primary-key value within a database or in a particular implementation.</td></tr><tr><td><code>@ID_Context</code></td><td>String</td><td>0..1</td><td>Used to identify the source of the identifier.</td></tr><tr><td><code>Profile</code></td><td>Element</td><td>1</td><td>Provides detailed information regarding either a company or a customer profile.</td></tr><tr><td><code>@ProfileType</code></td><td>Integer</td><td>1</td><td>Code to specify a profile such as Customer, Corporation, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#profile-type-prt">OpenTravel Code List Profile Type (PRT)</a>.</td></tr><tr><td><code>@ShareAllOptOutInd</code></td><td>Boolean</td><td>0..1</td><td>Customer has 'opted out' of receiving marking information (Non EU).</td></tr><tr><td><code>@ShareAllMarketInd</code></td><td>Boolean</td><td>0..1</td><td>Customer has 'opted in' to receive marking information (EU Customers).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td>1</td><td>Detailed customer information for this profile.</td></tr><tr><td><code>@VIP_Indicator</code></td><td>Boolean</td><td>0..1</td><td>If true, indicates a very important person.</td></tr><tr><td><code>@CustomerValue</code></td><td>String</td><td>0..1</td><td>The supplier's ranking of the customer (e.g., VIP, numerical ranking).</td></tr><tr><td><code>@BirthDate</code></td><td>DateTime</td><td>0..1</td><td>The customer’s birthday information.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td>0..1</td><td>Detailed name information for the customer.</td></tr><tr><td><code>@Language</code></td><td>String</td><td>0..1</td><td>The language code for which the name data is represented.</td></tr><tr><td><code>@NameType</code></td><td>Integer</td><td>0..1</td><td>Former, Nickname, Alternate, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x">OpenTravel Codes List - Name Type (NAM)</a>.</td></tr><tr><td><code>NamePrefix</code></td><td>Element</td><td>0..3</td><td>Salutation of honorific (e.g. Mr., Mrs., Ms., Miss, Dr.)</td></tr><tr><td><code>GivenName</code></td><td>Element</td><td>0..5</td><td>Given name, first name or names.</td></tr><tr><td><code>MiddleName</code></td><td>Element</td><td>0..3</td><td>The middle name of the person name.</td></tr><tr><td><code>Surname</code></td><td>Element</td><td>1</td><td>Family or last name.</td></tr><tr><td><code>NameSuffix</code></td><td>Element</td><td>0..3</td><td>Name suffixes and letters (e.g. Jr., Sr., III, Ret., Esq.)</td></tr><tr><td><code>NameTitle</code></td><td>Element</td><td>0..5</td><td>Degree or honours (e.g., Ph.D., M.D.)</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td>0..5</td><td>Information on a telephone number for the customer. Max 5 per reservation.</td></tr><tr><td><code>@PhoneLocationType</code></td><td>Integer</td><td>0..1</td><td>Describes the location of the phone, such as Home, Office, Property Reservation Office, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x">OpenTravel Code List - Phone Location Type (PLT)</a>.</td></tr><tr><td><code>@PhoneTechType</code></td><td>Integer</td><td>0..1</td><td>Indicates the type of technology associated with this telephone number, such as Voice, Data, Fax, Pager, Mobile, TTY, etc. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#phone-technology-type-ptt">OpenTravel Code List - Phone Technology Type (PTT)</a>.</td></tr><tr><td><code>@PhoneNumber</code></td><td>String</td><td>1</td><td>Telephone number assigned to a single location.</td></tr><tr><td><code>@CountryAccessCode</code></td><td>Integer</td><td>0..1</td><td>Code assigned by telecommunications authorities for international country access identifier.</td></tr><tr><td><code>@AreaCityCode</code></td><td>Integer</td><td>0..1</td><td>Code assigned for telephones in a specific region, city, or area.</td></tr><tr><td><code>@FormattedInd</code></td><td>Boolean</td><td>0..1</td><td>Specifies if the associated data is formatted or not. When true, then it is formatted; when false, then not formatted.</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td>0..1</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>@Remark</code></td><td>String</td><td>0..1</td><td>A remark associated with the telephone number.</td></tr><tr><td><code>Email</code></td><td>Element</td><td>0..5</td><td>Information on an email address for the customer. Max 5 per reservation.</td></tr><tr><td><code>@EmailType</code></td><td>Integer</td><td>0..1</td><td>Defines the purpose of the e-mail address (e.g. personal, business, listserve). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#email-address-type-eat">OpenTravel Code List - Email Address Type (EAT</a>).</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td>0..1</td><td>When true, indicates a default value should be used.</td></tr><tr><td><code>Address</code></td><td>Element</td><td>0..5</td><td>Detailed information on an address for the customer.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td>0..1</td><td>Defines the type of address (e.g. home, business, other). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x">OpenTravel Code List - Communication Location Type (CLT)</a>.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td>0..5</td><td>These lines will contain free form address details.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td>0..1</td><td>City (e.g., Dublin), town, or postal station.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td>0..1</td><td>State, province, or region name.</td></tr><tr><td><code>@StateCode</code></td><td>String</td><td>0..1</td><td>The standard code or abbreviation for the state, province, or region.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td>0..1</td><td>Post Office Code number.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td>0..1</td><td>Country name (e.g., Ireland).</td></tr><tr><td><code>@Code</code></td><td>String</td><td>0..1</td><td><code>ISO 3166</code> code for a country.</td></tr><tr><td><code>Email</code></td><td>Element</td><td>0..5</td><td>Information on an email address for the contact person for the company.</td></tr><tr><td><code>@EmailType</code></td><td>Integer</td><td>0..1</td><td>Defines the purpose of the e-mail address (e.g. personal, business, listserve). Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x#email-address-type-eat">OpenTravel Code List Email Address Type (EAT)</a>.</td></tr><tr><td><code>@DefaultInd</code></td><td>Boolean</td><td>0..1</td><td>When true, indicates a default value should be used.</td></tr></tbody></table>

### TotalCommission

```xml
<TotalCommissions>
	<UniqueID Type="5" ID="11395LYN"/>
	<CommissionPayableAmount CurrencyCode="AUD" Amount="25.00"/>
	<Comment>
		<Text>Booking agent reservation commission - flat rate.</Text>
	</Comment>
</TotalCommissions>
```

<table><thead><tr><th width="214">Element / @Attribute</th><th width="98">Type</th><th width="60">M</th><th>Description</th></tr></thead><tbody><tr><td><code>TotalCommissions</code></td><td>Element</td><td>0..1</td><td>Contains details pertaining to commissions.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td>0..1</td><td>Identifies the recipient of the commission.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td>1</td><td>A unique identifying value assigned by the creating system. The ID attribute may be used to reference a primary-key value within a database or in a particular implementation.</td></tr><tr><td><code>@ID</code></td><td>String</td><td>1</td><td>A reference to the type of object defined by the UniqueID element. Refer to <a href="/pages/IG8dKV52Ty9x3QCHTV1x">OpenTravel Code List - Unique ID Type (UIT)</a>.</td></tr><tr><td><code>CommissionPayableAmount</code></td><td>Element</td><td>0..1</td><td>The amount of commission to be paid.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td>0..1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td>0..1</td><td>A monetary amount.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td>0..1</td><td>Holds the actual comment.</td></tr><tr><td><code>Text</code></td><td>Element</td><td>1</td><td>The content of the comment related to the commission.</td></tr></tbody></table>

### BasicPropertyInfo

{% code overflow="wrap" %}

```xml
<BasicPropertyInfo ChainCode="GLDNRIV" BrandCode="GRH-P" HotelCode="GRHP6597" HotelName="Golden River Hotel - Perth"/>
```

{% endcode %}

<table><thead><tr><th width="226">Element / @Attribute</th><th width="104">Type</th><th width="71">M</th><th>Description</th></tr></thead><tbody><tr><td><code>BasicPropertyInfo</code></td><td>Element</td><td>1</td><td>Property information for the reservation.</td></tr><tr><td><code>@ChainCode</code></td><td>String</td><td>0..1</td><td>The code that identifies a hotel chain or management group. The hotel chain code is decided between vendors.</td></tr><tr><td><code>@BrandCode</code></td><td>String</td><td>0..1</td><td>A code that identifies the brand or flag of a hotel, often used for independently owned or franchised properties that are known by a specific brand.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td>1</td><td>The code that uniquely identifies a single hotel property. The hotel code is decided between vendors.</td></tr><tr><td><code>@HotelName</code></td><td>String</td><td>0..1</td><td>A text field used to communicate the proper name of the hotel.</td></tr></tbody></table>

## 2. Confirmation Response <a href="#id-2.-confirmation-response-structure" id="id-2.-confirmation-response-structure"></a>

SiteMinder's response determines the next steps for your integration. Understanding these outcomes is critical for proper error handling and retry logic.

* **Successful Delivery**: If SiteMinder responds with `<Success/>` and returns the SiteMinder Reservation ID (`UniqueID` `Type="14"`) and Payment Context ID (`UniqueID` `Type="34"`) the reservation is successfully stored..
* **Error in Delivery**: If SiteMinder responds with `<Errors>` containing an error description, the reservation must be retained in your PMS retry cycle and resent after resolving the error. If retry cycle expires, manual intervention may be required.
* **Connectivity Issues**: If no response received due to network outages the reservation must be retained in your retry cycle and resent once connectivity is restored. If retry cycle expires, manual intervention may be required.

{% tabs %}
{% tab title="Success" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:29:41+00:00" Version="1.0" ResResponseType="Modified">
			<Success/>
			<HotelReservations>
				<HotelReservation>
					<UniqueID ID="123456789" Type="14" /> <!-- Reservation Id-->
					<UniqueID ID="74a63a92-d988-46b8-8476-3319285af8ac" Type="34" /> <!-- Payment Context ID -->
				</HotelReservation>
			</HotelReservations>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Success + Warning" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:29:41+00:00" Version="1.0" ResResponseType="Modified">
			<Success/>
			<Warnings>
				<Warning Type="10" Code="310">Missing last name</Warning>
			</Warnings>
			<HotelReservations>
				<HotelReservation>
					<UniqueID ID="123456789" Type="14" /> <!-- Reservation Id-->
					<UniqueID ID="74a63a92-d988-46b8-8476-3319285af8ac" Type="34" /> <!-- Payment Context ID -->
				</HotelReservation>
			</HotelReservations>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Error" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="879791900" TimeStamp="2014-01-26T19:31:02-05:00" Version="1.001" ResResponseType="Modified">
			<Errors>
				<Error Type="5">Authentication timed out</Error>
			</Errors>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="257">Element / @Attribute</th><th width="108">Type</th><th width="77" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>OTA_HotelResNotifRS</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>@ResResponseType</code></td><td>String</td><td align="center">0..1</td><td><p>Given that the <code>OTA_HotelResNotifRQ</code> message is used for additions, modifications and cancellations, this attribute is used to replicate whether the original message was an addition, a modification or a cancellation and does not refer to the status of the transaction itself but rather to the nature of the original message.<br><br>The only three enumerations allowed are:<br><code>Committed</code></p><p><code>Modified</code></p><p><code>Cancelled</code>.</p></td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-warning-types">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-codes">Error Codes (ERR)</a>.</td></tr><tr><td><code>@RecordID</code></td><td>Integer</td><td align="center">0..1</td><td>If the receiving system is able to identify within a batch of reservations which reservation failed, the <code>UniqueID</code> of the rejected reservation should be reported here.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Annotation that the reservation batch was received successfully.<br><br>Mandatory if no <code>Errors</code> were sent. It can be combined with <code>Warnings</code> messages if some of the reservations in the batch had issues.</td></tr><tr><td><code>Warnings</code></td><td>Element</td><td align="center">0..1</td><td>Only can be used in conjunction with a <code>Success</code> message.</td></tr><tr><td><code>Warning</code></td><td>Element</td><td align="center">0..99</td><td>Contains details of the warning returned.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-warning-types">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td><p>Code representing the error. Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/error-codes">Error Codes (ERR)</a>.</p><p><br></p></td></tr><tr><td><code>@RecordID</code></td><td>Integer</td><td align="center">0..1</td><td>If the receiving system is able to identify within a batch of reservations which reservation has a warning, the <code>UniqueID</code> of that reservation should be reported here.</td></tr><tr><td><code>HotelReservations</code></td><td>Element</td><td align="center">1</td><td>Contains details of the reservation made.</td></tr><tr><td><code>HotelReservation</code></td><td>Element</td><td align="center">1</td><td>Individual hotel reservation information.</td></tr><tr><td><code>@ResStatus</code></td><td>String</td><td align="center">0..1</td><td><p>Indicates the current status of the reservation. Valid values are dependent on the roles:</p><p><code>Reserved</code></p><p><code>Waitlisted</code></p><p><code>In-house</code></p><p><code>Checked-Out</code></p></td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">1..2</td><td>Unique identifier for the reservation.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">1</td><td><code>14</code> - Reservation ID<br><code>34</code> - SM Platform Res ID</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Actual confirmation number.</td></tr></tbody></table>

## Reservation XML Samples

<details>

<summary>Maximum Content XML</summary>

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:UsernameToken><wsse:Username>USERNAME</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body><OTA_HotelResNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00"><HotelReservations><HotelReservation ResStatus="Reserved" CreateDateTime="2025-09-19T18:02:44+00:00" CreatorID="LINDA-RESAGENT" LastModifyDateTime="2025-09-19T18:13:51+00:00" LastModifierID="651651651651"><POS><Source><RequestorID Type="10" ID="PMSCODE"/><BookingChannel Primary="true" Type="4"><CompanyName Code="PMSCODE">PMS NAME</CompanyName></BookingChannel></Source></POS><UniqueID ID="ABC-1234567890"/><RoomStays><RoomStay MarketCode="Corporate" SourceOfBusiness="Radio" PromotionCode="STAYNSAVE15"><RoomTypes><RoomType RoomType="Deluxe" RoomTypeCode="DLX" RoomCategory="4" RoomID="1501" NonSmoking="true" Configuration="King Split + Single Bed"><RoomDescription><Text>Deluxe Room with a lovely view over the harbour and a seperate lounge with 50" LED TV</Text></RoomDescription><AdditionalDetails><AdditionalDetail Type="4" Code="CORNERROOM"><DetailDescription><Text>This room is a Deluxe Corner Room</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RoomType></RoomTypes><RatePlans><RatePlan RatePlanCode="WKGPKG" EffectiveDate="2025-12-01" ExpireDate="2025-12-03" RatePlanName="Weekend Package"><RatePlanDescription><Text>Weekend Package includes wine, chocolates, champagne on arrival and late checkout at 3PM</Text></RatePlanDescription><RatePlanInclusions TaxInclusive="true" ServiceFeeInclusive="false"><RatePlanInclusionDescription><Text>Champagne on arrival, English Breakfast, Chocolates and 3PM Checkout </Text></RatePlanInclusionDescription></RatePlanInclusions><MealsIncluded MealPlanIndicator="true" MealPlanCodes="7"/><AdditionalDetails><AdditionalDetail Type="12" Code="WKDNDPKGINFO"><DetailDescription><Text>Some parts of this package (such as wine selection) will need to be arranged with guest prior to check-in</Text></DetailDescription></AdditionalDetail></AdditionalDetails></RatePlan></RatePlans><RoomRates><RoomRate InvBlockCode="HIGHROLL" NumberOfUnits="1" RoomID="1501" RoomTypeCode="DLX" RatePlanCode="WKGPKG" RatePlanCategory="Consumer Packages" EffectiveDate="2025-12-01" ExpireDate="2025-12-03"><Rates><Rate EffectiveDate="2025-12-01" ExpireDate="2025-12-02" UnitMultiplier="1"><Base AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="10.00"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="120.00" AmountAfterTax="132.00" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="12.00"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax></Taxes></Total></Rate><Rate EffectiveDate="2025-12-02" ExpireDate="2025-12-03" UnitMultiplier="1"><Base AmountBeforeTax="80.00" AmountAfterTax="88.00" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="8.00"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax></Taxes></Base><Total AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="10.00"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax></Taxes></Total></Rate></Rates><ServiceRPHs><ServiceRPH RPH="1"/></ServiceRPHs></RoomRate></RoomRates><GuestCounts><GuestCount AgeQualifyingCode="10" Age="51" Count="1" AgeBucket="AdultOver50"/><GuestCount AgeQualifyingCode="10" Age="44" Count="1" AgeBucket="AdultOver40"/></GuestCounts><TimeSpan Start="2025-12-01" End="2025-12-03"/><Guarantee GuaranteeCode="COMBINED_GUARANTEE" GuaranteeType="DepositRequired"><GuaranteesAccepted><GuaranteeAccepted PaymentTransactionTypeCode="charge"><PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720"><CardHolderName>Leonard Woolf</CardHolderName><CardNumber Mask="4021XXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber></PaymentCard></GuaranteeAccepted><GuaranteeAccepted PaymentTransactionTypeCode="charge"><Voucher SeriesCode="4555"/></GuaranteeAccepted><GuaranteeAccepted PaymentTransactionTypeCode="charge"><DirectBill DirectBill_ID="4981003"/></GuaranteeAccepted></GuaranteesAccepted><GuaranteeDescription><Text>Combined Guarantees Accepted (Platinum Membership)</Text></GuaranteeDescription></Guarantee><DepositPayments><GuaranteePayment><AcceptedPayments><AcceptedPayment PaymentTransactionTypeCode="charge"><PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720"><CardHolderName>Leonard Woolf</CardHolderName><CardNumber Mask="4021XXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber></PaymentCard></AcceptedPayment></AcceptedPayments><AmountPercent Percent="30" CurrencyCode="AUD" Amount="64.52" NmbrOfNights="2"><Taxes CurrencyCode="AUD" Amount="1.29"><Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="2"><TaxDescription><Text>Credit Card surcharge.</Text></TaxDescription></Tax></Taxes></AmountPercent><Deadline AbsoluteDeadline="2025-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/><Description><Text>30% deposit (of the total cost of the stay) will be charged to card holder's account 10 days before the date of arrival at the latest.</Text></Description><Address Type="1"><AddressLine>12 Pine Street</AddressLine><CityName>Sydney</CityName><PostalCode>2095</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address></GuaranteePayment><GuaranteePayment><AcceptedPayments><AcceptedPayment PaymentTransactionTypeCode="charge"><Voucher SeriesCode="4555"/></AcceptedPayment></AcceptedPayments><AmountPercent Percent="10" CurrencyCode="AUD" Amount="21.51" NmbrOfNights="2"><Taxes CurrencyCode="AUD" Amount="1.08"><Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="5"><TaxDescription><Text>Payment surcharge.</Text></TaxDescription></Tax></Taxes></AmountPercent><Deadline AbsoluteDeadline="2025-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/><Description><Text>10% deposit (of the total cost of the stay) will be charged using provided Voucher code 10 days before the date of arrival at the latest.</Text></Description><Address Type="1"><AddressLine>12 Pine Street</AddressLine><CityName>Sydney</CityName><PostalCode>2095</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address></GuaranteePayment><GuaranteePayment><AcceptedPayments><AcceptedPayment PaymentTransactionTypeCode="charge"><DirectBill DirectBill_ID="4981003"/></AcceptedPayment></AcceptedPayments><AmountPercent Percent="20" CurrencyCode="AUD" Amount="43.01" NmbrOfNights="2"><Taxes CurrencyCode="AUD" Amount="2.15"><Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="5"><TaxDescription><Text>Payment surcharge.</Text></TaxDescription></Tax></Taxes></AmountPercent><Deadline AbsoluteDeadline="2025-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/><Description><Text>20% deposit (of the total cost of the stay) will be charged using Direct Bill ID provided 10 days before the date of arrival at the latest.</Text></Description><Address Type="2"><AddressLine>125 Pitt Street</AddressLine><CityName>Sydney</CityName><PostalCode>2000</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address></GuaranteePayment></DepositPayments><Discount TaxInclusive="true" Percent="15" DiscountCode="STAYNSAVE15" AmountBeforeTax="33.00" AmountAfterTax="36.30" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="3.30"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax></Taxes><DiscountReason><Text>Stay 2 nights and get 15% off.</Text></DiscountReason></Discount><Total AmountBeforeTax="187.00" AmountAfterTax="215.05" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="28.05"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax><Tax Code="21" Amount="0" CurrencyCode="AUD" Percent="5"><TaxDescription><Text>Insurance Premium Tax</Text></TaxDescription></Tax></Taxes></Total><ResGuestRPHs><ResGuestRPH RPH="1"/><ResGuestRPH RPH="2"/></ResGuestRPHs><Memberships><Membership ProgramCode="Platinum" AccountID="8943112"/><Membership ProgramCode="Platinum" AccountID="8943966"/></Memberships><Comments><Comment GuestViewable="true"><Text>Platinum Members are offered a free spa entry for the whole length of stay.</Text></Comment></Comments><SpecialRequests><SpecialRequest RequestCode="Bedding Configuration" CodeContext="GUEST_DIRECT"><Text>King Split + Single Bed.</Text></SpecialRequest><SpecialRequest RequestCode="Smoking" CodeContext="CHANNEL"><Text>Non-smoking room.</Text></SpecialRequest></SpecialRequests></RoomStay></RoomStays><Services><Service ServicePricingType="Per night" ServiceCategoryCode="PARKING" ServiceInventoryCode="ACAR_PARK" Inclusive="true" Quantity="1" ServiceRPH="1" Type="10" ID="01120302A3" ID_Context="HOTEL"><Price><Total AmountBeforeTax="20.00" AmountAfterTax="22.00" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="2.00"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax></Taxes></Total></Price><ServiceDetails><GuestCounts><GuestCount AgeQualifyingCode="10" Age="44" Count="1" AgeBucket="AdultOver40"/></GuestCounts><TimeSpan Start="2025-12-01" End="2025-12-03"/><Comments><Comment GuestViewable="false"><Text>Car space needs to be released before 3PM check-out day. No exceptions allowed.</Text></Comment></Comments><ServiceDescription><Text>Accessible, covered and secured vehicle storage space.</Text></ServiceDescription></ServiceDetails></Service><Service ServicePricingType="Per person" ServiceCategoryCode="GUEST" ServiceInventoryCode="CLIENT" Inclusive="false" Quantity="1" ServiceRPH="2" Type="1" ID="CLI8569" ID_Context="GUEST_DIRECT"><Price><Total AmountBeforeTax="30.00" AmountAfterTax="36.00" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="6.00"><Tax Code="14" Amount="0" CurrencyCode="AUD" Percent="20"><TaxDescription><Text>Service charge</Text></TaxDescription></Tax></Taxes></Total></Price><ServiceDetails><GuestCounts><GuestCount AgeQualifyingCode="10" Age="51" Count="1" AgeBucket="AdultOver50"/></GuestCounts><TimeSpan Start="2025-12-01" End="2025-12-02"/><Comments><Comment GuestViewable="true"><Text>French manicure - Platinum Members are offered a free pedicure.</Text></Comment></Comments><ServiceDescription><Text>Manicure and pedicure set.</Text></ServiceDescription></ServiceDetails></Service><ServiceCategory ServiceCategoryCode="PARKING"/><ServiceCategory ServiceCategoryCode="GUEST"/></Services><BillingInstructionCode BillingCode="385H45991" AccountNumber="WOOLF05301300" Start="2025-12-01" End="2025-12-03" AuthorizationCode="7985" Description="Please follow billing instructions for Platinum Membership."><ResGuestRPH RPH="1"/></BillingInstructionCode><ResGuests><ResGuest ResGuestRPH="1" AgeQualifyingCode="10" ArrivalTime="13:30:00" PrimaryIndicator="true" Age="51"><Profiles><ProfileInfo><UniqueID Type="1" ID="8943112" ID_Context="PROPERTY"/><Profile ProfileType="1" ShareAllOptOutInd="true" ShareAllMarketInd="false"><Customer VIP_Indicator="true" CustomerValue="Platinum" BirthDate="1966-07-16"><PersonName NameType="2" Language="en"><NamePrefix>Mrs.</NamePrefix><GivenName>Ginny</GivenName><MiddleName>Adeline</MiddleName><Surname>Woolf</Surname><NameSuffix>Jr.</NameSuffix><NameTitle>Ph.D.</NameTitle></PersonName><Telephone PhoneLocationType="10" PhoneTechType="5" CountryAccessCode="61" AreaCityCode="4" PhoneNumber="13855956" Remark="Active" FormattedInd="false" DefaultInd="true"/><Email DefaultInd="true" EmailType="1">virginia.woolf@example.com</Email><Address Type="2"><AddressLine>125 Pitt Street</AddressLine><CityName>Sydney</CityName><PostalCode>2000</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName><CompanyName Code="DLW">Dalloway</CompanyName></Address><CustLoyalty ProgramID="PLATINUM5+5" MembershipID="8943112" LoyalLevel="VIP" LoyalLevelCode="10" SignupDate="2024-08-08" EffectiveDate="2024-08-08" ExpireDate="2024-08-08" Remark="5+5 DEAL (Sign up for 5 years of Platinum membership, get another 5 years for free)"/></Customer><CompanyInfo><CompanyName Code="DLW">Dalloway</CompanyName><AddressInfo Type="2"><AddressLine>88 Pall Mall</AddressLine><CityName>London</CityName><PostalCode>SW1Y 5ER</PostalCode><StateProv StateCode="ENG">England</StateProv><CountryName Code="UK">United Kingdom</CountryName></AddressInfo><TelephoneInfo PhoneLocationType="9" PhoneTechType="1" CountryAccessCode="44" AreaCityCode="20" PhoneNumber="23983039" Remark="Only active during business hours: 8AM-8PM BST" FormattedInd="false" DefaultInd="true"/><Email DefaultInd="true" EmailType="2">info@example.com</Email><ContactPerson><PersonName NameType="3" Language="en-UK"><NamePrefix>Mr.</NamePrefix><GivenName>Warren</GivenName><MiddleName>Glass</MiddleName><Surname>Smith</Surname><NameSuffix>II</NameSuffix><NameTitle>M.D.</NameTitle></PersonName><Telephone PhoneLocationType="10" PhoneTechType="5" CountryAccessCode="44" AreaCityCode="20" PhoneNumber="28596654" Remark="Active" FormattedInd="false" DefaultInd="true"/><Address Type="2"><AddressLine>88 Pall Mall</AddressLine><CityName>London</CityName><PostalCode>SW1Y 5ER</PostalCode><StateProv StateCode="ENG">England</StateProv><CountryName Code="UK">United Kingdom</CountryName></Address><Email DefaultInd="true" EmailType="2">phillip.glass-smith@example.com</Email></ContactPerson></CompanyInfo></Profile></ProfileInfo></Profiles><SpecialRequests><SpecialRequest RequestCode="Room features" CodeContext="GUEST_DIRECT"><Text>Aircon off</Text></SpecialRequest></SpecialRequests><Comments><Comment GuestViewable="false"><Text>No flowers - pollen allergy.</Text></Comment></Comments><ServiceRPHs><ServiceRPH RPH="2"/></ServiceRPHs><ArrivalTransport><TransportInfo Type="Rail" ID="80D-AAE" Time="2025-12-01T09:25:00"/></ArrivalTransport><DepartureTransport><TransportInfo Type="Rail" ID="77D-ABB" Time="2025-12-03T20:05:00"/></DepartureTransport></ResGuest><ResGuest ResGuestRPH="2" AgeQualifyingCode="10" ArrivalTime="15:30:00" PrimaryIndicator="false" Age="44"><Profiles><ProfileInfo><UniqueID Type="1" ID="8943966" ID_Context="PROPERTY"/><Profile ProfileType="1" ShareAllOptOutInd="true" ShareAllMarketInd="false"><Customer VIP_Indicator="true" CustomerValue="Platinum" BirthDate="1973-04-12"><PersonName NameType="2" Language="en"><NamePrefix>Mr.</NamePrefix><GivenName>Willy</GivenName><Surname>Bradshaw</Surname></PersonName><Telephone PhoneLocationType="10" PhoneTechType="5" CountryAccessCode="61" AreaCityCode="4" PhoneNumber="138564216" Remark="Active" FormattedInd="false" DefaultInd="true"/><Email DefaultInd="true" EmailType="2">wbradshaw@example.com</Email><Address Type="1"><AddressLine>3 Hunter Street</AddressLine><CityName>Sydney</CityName><PostalCode>2025</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address><CustLoyalty ProgramID="PLAT" MembershipID="8943966" LoyalLevel="VIP" LoyalLevelCode="10" SignupDate="2024-04-18" EffectiveDate="2024-06-25" ExpireDate="2030-06-25" Remark="Standard 5 year membership."/></Customer><CompanyInfo><CompanyName Code="ORL">Orlando</CompanyName><AddressInfo Type="2"><AddressLine>175B George Street</AddressLine><CityName>Sydney</CityName><PostalCode>2000</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></AddressInfo><TelephoneInfo PhoneLocationType="7" PhoneTechType="1" CountryAccessCode="61" AreaCityCode="2" PhoneNumber="45665039" Remark="All phone calls are recorded." FormattedInd="false" DefaultInd="true"/><Email DefaultInd="true" EmailType="2">info@example.com</Email></CompanyInfo></Profile></ProfileInfo></Profiles><Comments><Comment GuestViewable="false"><Text>Disability - accessible room and parking space necessary.</Text></Comment></Comments><ArrivalTransport><TransportInfo Type="Air" ID="QR199" Time="2025-12-01T12:30:00"/></ArrivalTransport><DepartureTransport><TransportInfo Type="Rail" ID="77D-ABB" Time="2025-12-03T20:05:00"/></DepartureTransport></ResGuest></ResGuests><ResGlobalInfo><GuestCounts><GuestCount AgeQualifyingCode="10" Age="51" Count="1" AgeBucket="AdultOver50"/><GuestCount AgeQualifyingCode="10" Age="44" Count="1" AgeBucket="AdultOver40"/></GuestCounts><TimeSpan Start="2025-12-01" End="2025-12-03"/><Memberships><Membership ProgramCode="Platinum" AccountID="8943112"/><Membership ProgramCode="Platinum" AccountID="8943966"/></Memberships><Comments><Comment GuestViewable="true"><Text>Business trip</Text></Comment></Comments><SpecialRequests><SpecialRequest RequestCode="Staff" CodeContext="GUEST_DIRECT"><Text>Please make sure your chef Leonard is on duty during our stay, thanks.</Text></SpecialRequest></SpecialRequests><Guarantee GuaranteeCode="COMBINED_GUARANTEE" GuaranteeType="DepositRequired"><GuaranteesAccepted><GuaranteeAccepted PaymentTransactionTypeCode="charge"><PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720"><CardHolderName>Leonard Woolf</CardHolderName><CardNumber Mask="4021XXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber></PaymentCard></GuaranteeAccepted><GuaranteeAccepted PaymentTransactionTypeCode="charge"><Voucher SeriesCode="4555"/></GuaranteeAccepted><GuaranteeAccepted PaymentTransactionTypeCode="charge"><DirectBill DirectBill_ID="4981003"/></GuaranteeAccepted></GuaranteesAccepted><GuaranteeDescription><Text>Combined Guarantees Accepted (Platinum Membership)</Text></GuaranteeDescription></Guarantee><DepositPayments><GuaranteePayment><AcceptedPayments><AcceptedPayment PaymentTransactionTypeCode="charge"><PaymentCard CardCode="VI" EffectiveDate="0717" ExpireDate="0720"><CardHolderName>Leonard Woolf</CardHolderName><CardNumber Mask="4021XXXXXXXXX8995" Token="0087254835699221" TokenProviderID="VTS"></CardNumber></PaymentCard></AcceptedPayment></AcceptedPayments><AmountPercent Percent="30" CurrencyCode="AUD" Amount="76.67" NmbrOfNights="2"><Taxes CurrencyCode="AUD" Amount="1.53"><Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="2"><TaxDescription><Text>Credit Card surcharge.</Text></TaxDescription></Tax></Taxes></AmountPercent><Deadline AbsoluteDeadline="2025-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/><Description><Text>30% deposit (of the total reservation cost) will be charged to card holder's account 10 days before the date of arrival at the latest.</Text></Description><Address Type="1"><AddressLine>12 Pine Street</AddressLine><CityName>Sydney</CityName><PostalCode>2095</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address></GuaranteePayment><GuaranteePayment><AcceptedPayments><AcceptedPayment PaymentTransactionTypeCode="charge"><Voucher SeriesCode="4555"/></AcceptedPayment></AcceptedPayments><AmountPercent Percent="10" CurrencyCode="AUD" Amount="25.56" NmbrOfNights="2"><Taxes CurrencyCode="AUD" Amount="1.28"><Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="5"><TaxDescription><Text>Payment surcharge.</Text></TaxDescription></Tax></Taxes></AmountPercent><Deadline AbsoluteDeadline="2025-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/><Description><Text>10% deposit (of the total reservation cost) will be charged using provided Voucher code 10 days before the date of arrival at the latest.</Text></Description><Address Type="1"><AddressLine>12 Pine Street</AddressLine><CityName>Sydney</CityName><PostalCode>2095</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address></GuaranteePayment><GuaranteePayment><AcceptedPayments><AcceptedPayment PaymentTransactionTypeCode="charge"><DirectBill DirectBill_ID="4981003"/></AcceptedPayment></AcceptedPayments><AmountPercent Percent="20" CurrencyCode="AUD" Amount="51.11" NmbrOfNights="2"><Taxes CurrencyCode="AUD" Amount="2.56"><Tax Code="16" Amount="0" CurrencyCode="AUD" Percent="5"><TaxDescription><Text>Payment surcharge.</Text></TaxDescription></Tax></Taxes></AmountPercent><Deadline AbsoluteDeadline="2025-11-21T12:00:00+00:00" OffsetTimeUnit="Day" OffsetUnitMultiplier="10" OffsetDropTime="BeforeArrival"/><Description><Text>20% deposit (of the total reservation cost) will be charged using Direct Bill ID provided 10 days before the date of arrival at the latest.</Text></Description><Address Type="2"><AddressLine>125 Pitt Street</AddressLine><CityName>Sydney</CityName><PostalCode>2000</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address></GuaranteePayment></DepositPayments><Total AmountBeforeTax="217.00" AmountAfterTax="255.55" CurrencyCode="AUD"><Taxes CurrencyCode="AUD" Amount="38.55"><Tax Code="19" Amount="0" CurrencyCode="AUD" Percent="10"><TaxDescription><Text>GST</Text></TaxDescription></Tax><Tax Code="21" Amount="0" CurrencyCode="AUD" Percent="5"><TaxDescription><Text>Insurance Premium Tax</Text></TaxDescription></Tax><Tax Code="14" Amount="6.00" CurrencyCode="AUD" Percent="0"><TaxDescription><Text>Service charge - manicure</Text></TaxDescription></Tax></Taxes></Total><HotelReservationIDs><HotelReservationID ResID_Type="14" ResID_Value="1234567890" ResID_Source="PMSCODE"/><HotelReservationID ResID_Type="25" ResID_Value="ABC-1234567890" ResID_Source="SITEMINDER"/></HotelReservationIDs><Profiles><ProfileInfo><UniqueID Type="1" ID="8942213" ID_Context="PROPERTY"/><Profile ShareAllMarketInd="true" ShareAllOptOutInd="false" ProfileType="1"><Customer VIP_Indicator="true" CustomerValue="5" BirthDate="1959-12-12"><PersonName NameType="2" Language="en"><NamePrefix>Mr.</NamePrefix><GivenName>Leo</GivenName><MiddleName>Darcy</MiddleName><Surname>Woolf</Surname><NameSuffix>Ret.</NameSuffix><NameTitle>BA</NameTitle></PersonName><Telephone PhoneLocationType="10" PhoneTechType="5" CountryAccessCode="61" AreaCityCode="4" PhoneNumber="23865911" Remark="Active" FormattedInd="false" DefaultInd="true"/><Email DefaultInd="true" EmailType="1">leonardowoolf59@example.com</Email><Address Type="1"><AddressLine>12 Pine Street</AddressLine><CityName>Sydney</CityName><PostalCode>2095</PostalCode><StateProv StateCode="NSW">New South Wales</StateProv><CountryName Code="AU">Australia</CountryName></Address><CustLoyalty ProgramID="GOLD" MembershipID="8974358" LoyalLevel="VIP" LoyalLevelCode="2" SignupDate="2002-01-06" EffectiveDate="2002-01-06" ExpireDate="2032-01-06" Remark="30 years + Membership"/></Customer></Profile></ProfileInfo><ProfileInfo><Profile ProfileType="5"><CompanyInfo><CompanyName Code="ASTERIX">Asterix</CompanyName><AddressInfo Type="2"><AddressLine>360C Bergen Street</AddressLine><CityName>New York - Brooklyn</CityName><PostalCode>11238</PostalCode><StateProv StateCode="NY">New York</StateProv><CountryName Code="US">United States</CountryName></AddressInfo><TelephoneInfo  PhoneLocationType="9" PhoneTechType="1" CountryAccessCode="1" AreaCityCode="212" PhoneNumber="44458561" Remark="Voicemail only" FormattedInd="false" DefaultInd="true"/><Email DefaultInd="true" EmailType="2">support@example.com</Email><ContactPerson><PersonName NameType="2" Language="en-US"><NamePrefix>Ms.</NamePrefix><GivenName>Elle</GivenName><MiddleName>Maria</MiddleName><Surname>VanHoff</Surname><NameSuffix>Jr.</NameSuffix><NameTitle>M.D.</NameTitle></PersonName><Telephone PhoneLocationType="9" PhoneTechType="1" CountryAccessCode="1" AreaCityCode="212" PhoneNumber="44458562" Remark="Helpdesk" FormattedInd="false" DefaultInd="true"/><Address Type="0"><AddressLine>360C Bergen Street</AddressLine><CityName>New York - Brooklyn</CityName><PostalCode>11238</PostalCode><StateProv StateCode="NY">New York</StateProv><CountryName Code="US">United States</CountryName></Address><Email DefaultInd="true" EmailType="2">elle.vanhoff@example.com</Email></ContactPerson></CompanyInfo></Profile></ProfileInfo></Profiles><TotalCommissions><UniqueID Type="5" ID="11395LYN"/><CommissionPayableAmount CurrencyCode="AUD" Amount="25.00"/><Comment><Text>Booking agent reservation commission - flat rate.</Text></Comment></TotalCommissions><BasicPropertyInfo ChainCode="GLDNRIV" BrandCode="GRH-P" HotelCode="HOTELCODE" HotelName="Golden River Hotel - Perth"/></ResGlobalInfo></HotelReservation></HotelReservations></OTA_HotelResNotifRQ></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

</details>

<details>

<summary>Minimum Recommended Content XML</summary>

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header><wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:UsernameToken><wsse:Username>USERNAME</wsse:Username><wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body><OTA_HotelResNotifRQ xmlns="http://www.opentravel.org/ota/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0"><HotelReservations><HotelReservation ResStatus="Reserved" WalkInIndicator="true" CreateDateTime="2024-07-05T15:30:35+00:00" LastModifyDateTime="2024-07-06T15:23:35+00:00" CreatorID="LINDA-RESAGENT" LastModifierID="651651651651"><POS><Source><RequestorID Type="10" ID="PMSCODE"/></Source><Source><BookingChannel Type="4" Primary="true"><CompanyName Code="PMSCODE">PMS NAME</CompanyName></BookingChannel></Source></POS><UniqueID ID="1234567890"/><RoomStays><RoomStay><RoomTypes><RoomType RoomType="Deluxe" RoomTypeCode="DLX" RoomID="1501"/></RoomTypes><RatePlans><RatePlan RatePlanCode="BAR" EffectiveDate="2025-12-01" ExpireDate="2025-12-02"/></RatePlans><RoomRates><RoomRate RoomID="1501" RoomTypeCode="DLX" RatePlanCode="BAR" EffectiveDate="2025-12-01" ExpireDate="2025-12-02"><Rates><Rate EffectiveDate="2025-12-01" ExpireDate="2025-12-02" UnitMultiplier="1"><Base AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD"/><Total AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD"/></Rate></Rates></RoomRate></RoomRates><GuestCounts><GuestCount AgeQualifyingCode="14" Count="2"/></GuestCounts><TimeSpan Start="2025-12-01" End="2025-12-02"/><Total AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD"/><ResGuestRPHs><ResGuestRPH RPH="1"/><ResGuestRPH RPH="2"/></ResGuestRPHs></RoomStay></RoomStays><ResGuests><ResGuest ResGuestRPH="1" AgeQualifyingCode="10" PrimaryIndicator="true"><Profiles><ProfileInfo><Profile ProfileType="1" ShareAllOptOutInd="true" ShareAllMarketInd="false"><Customer><PersonName><GivenName>Ginny</GivenName><Surname>Woolf</Surname></PersonName><Email>virginia.woolf@example.com</Email></Customer></Profile></ProfileInfo></Profiles></ResGuest><ResGuest ResGuestRPH="2" AgeQualifyingCode="10" PrimaryIndicator="false"><Profiles><ProfileInfo><Profile ShareAllOptOutInd="true" ShareAllMarketInd="false"><Customer><PersonName><GivenName>Willy</GivenName><Surname>Bradshaw</Surname></PersonName><Email>wbradshaw@oexample.com</Email></Customer></Profile></ProfileInfo></Profiles></ResGuest></ResGuests><ResGlobalInfo><GuestCounts><GuestCount AgeQualifyingCode="10" Count="2"/></GuestCounts><TimeSpan Start="2025-12-01" End="2025-12-02"/><Total AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="AUD"/><HotelReservationIDs><HotelReservationID ResID_Type="14" ResID_Value="1234567890" ResID_Source="PMSCODE"/></HotelReservationIDs><Profiles><ProfileInfo><Profile ProfileType="1" ShareAllOptOutInd="true" ShareAllMarketInd="false"><Customer><PersonName><GivenName>Leo</GivenName><Surname>Woolf</Surname></PersonName><Email>leonardowoolf59@example.com</Email></Customer></Profile></ProfileInfo></Profiles><BasicPropertyInfo HotelCode="HOTELCODE"/></ResGlobalInfo></HotelReservation></HotelReservations></OTA_HotelResNotifRQ></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Import

Bulk import active reservations from SiteMinder Platform to your PMS during initial integration setup.

{% hint style="warning" %}
It is a prerequisite to develop to the SiteMinder [**Reservations Upload**](/pmsxchange-api/reference/reservations/upload) to gain access to the **Reservation Import**. To discuss further, reach out to our Ecosystems team via <ecosystem.team@siteminder.com>.
{% endhint %}

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Reservations Import · **Direction:** SM → PMS · **Method:** Pull (PMS-initiated)
{% endhint %}

## What is Reservation Import?

**Reservation Import** is a one-time bulk retrieval method where the Property Management System (PMS) triggers an import job to receive all active reservations from the SiteMinder Platform. This integration is essential during initial PMS setup, allowing hotels to migrate their existing reservation data from SiteMinder into the new PMS without manual re-entry. Once triggered, SiteMinder processes all active future reservations and delivers them to the PMS using the standard reservation delivery method.

{% hint style="warning" %}
To implement **Reservations Import**, the PMS must certify for [Reservations PUSH](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations/reservations-push) or [Reservations PULL](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations/reservations-pull).
{% endhint %}

#### Considerations

* **Delivery Method**: Reservations will be delivered to the PMS using the normal reservation delivery method following the import trigger.
* **Failure Notifications**: The hotel will receive standard email reservation notifications if a reservation fails to deliver during the import process.
* **Reservation Scope**: Only active reservations and modifications are included in the import; cancellations are ignored. Active reservations are defined as future reservations that have not checked in yet.
* **Import Duration**: The import duration depends on several factors, including the total number of reservations to process and the volume of live reservations at the hotel.
* **Duplicate Handling**: The import may create duplicate entries in the hotel's PMS if some reservations have already been manually entered. It is not possible to exclude specific reservations from the import.
* **Completion Verification**: Currently, there is no direct way to confirm when the import has completed. A return to the normal frequency of live reservation deliveries typically indicates that the import has finished.

**Usage Note**: This function is intended for use when a hotel integrates with a new PMS. It should not be used to re-deliver reservations that may have failed due to an outage or other issues.

{% hint style="warning" %}
**Authentication Requirements**: The REST components of the pmsXchange API only support PMS-level authentication, which means using the same credentials across all properties. If you’re currently using hotel-level authentication (credentials per property), we recommend switching to PMS-level to ensure compatibility with the REST endpoints.
{% endhint %}

## POST /core-api/pmses/{pmsCode}/hotels/{hotelCode}/reservation-import

> Triggers the import active reservations job for requested hotel.

```json
{"openapi":"3.0.3","info":{"title":"pmsx/core-api","version":"1.0.2"},"servers":[{"url":"https://tpi-pmsx.preprod.siteminderlabs.com"}],"security":[{"basicAuth":[]}],"components":{"securitySchemes":{"basicAuth":{"type":"http","scheme":"basic"}},"parameters":{"traceToken":{"name":"X-SM-TRACE-TOKEN","in":"header","description":"traceToken is logged with every log messages for this request","required":true,"schema":{"type":"string"}},"pmsCode":{"in":"path","name":"pmsCode","description":"pmsCode used to identify the pmsx partner","schema":{"type":"string","minLength":1,"maxLength":255},"required":true},"hotelCode":{"in":"path","name":"hotelCode","description":"hotelCode used to identify the hotelier","required":true,"schema":{"type":"string","minLength":1,"maxLength":255}}},"headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string"},"description":"trace token"}},"responses":{"BadRequest":{"description":"Invalid request","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"Unauthorized":{"description":"Unauthorized","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"AccessDenied":{"description":"Access denied","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Not Found","headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"TooManyRequests":{"description":"Too Many Requests","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}},"ServiceUnavailableError":{"description":"Service Unavailable","headers":{"X-SM-TRACE-TOKEN":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Errors"}}}}},"schemas":{"Errors":{"type":"object","properties":{"errors":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"Error":{"type":"object","additionalProperties":false,"properties":{"code":{"type":"string","description":"- `invalid` is a generic code indicating an integration property does not match the constraints required by an integration. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `min` indicates either the field value (numeric) or string length is too small for given integration property. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `max` indicates either the field value (numeric) or string length is too large for given integration property. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `required` indicates that a given property that was required, was not specified in the request. Typically used for integration properties. For more details on the specific property consult `meta.field` and `meta.propertyName`\n- `conflict` indicates you are trying to create a resource e.g. pmsHotel which is already present. You will typically have `meta.entity` populated which takes on values `pms`, `pmsHotel`. The `meta.code` field is populated when `meta.entity` is pms and the `meta.uuid` field is populated when `meta.entity` is `pmsHotel`\n- `too-many-requests` indicates that the client has exceeded its API quota. It should wait for at least the specified time in seconds which is provided in the `Retry-After` HTTP header\n- `server` generic error\n- `UnauthorizedError` happens when we cannot authenticate the user\n- `AccessDenied` happens when we know who the user is, but they do not have required permissions to perform the action"},"message":{"description":"additional information on the error","type":"string"},"meta":{"description":"Contains any additional information to enrich the error.\nAll properties are optional.","additionalProperties":true,"type":"object","properties":{"code":{"type":"string","description":"Typically populated with we get a conflict error for the entity pms or when pms or integration is not found"},"uuid":{"type":"string","description":"Typically populated when we get a conflict error for the entity pmsHotel or when pmsHotel or pmsRoomRate is not found"},"entity":{"type":"string","description":"typically populated when a conflict error is raised. Also present in not found errors too"},"field":{"type":"string","description":"name of the field which typically has a validation error."},"propertyName":{"type":"string","description":"populated when the `meta.field` is set the `integrationProperties`. This tells us the property name in question that the error is for."},"dataPath":{"type":"string","description":"returned when there is a syntactic error in the request. That is the request is not compliant with the route."}}}}}}},"paths":{"/core-api/pmses/{pmsCode}/hotels/{hotelCode}/reservation-import":{"post":{"operationId":"importReservations","description":"Triggers the import active reservations job for requested hotel.","tags":["Reservation Import"],"parameters":[{"$ref":"#/components/parameters/traceToken"},{"$ref":"#/components/parameters/pmsCode"},{"$ref":"#/components/parameters/hotelCode"}],"responses":{"202":{"description":"Accepted for reservation import","headers":{"X-SM-TRACE-TOKEN":{"$ref":"#/components/headers/X-SM-TRACE-TOKEN"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/AccessDenied"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/ServerError"},"503":{"$ref":"#/components/responses/ServiceUnavailableError"}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Payment Transaction Record

Retrieve payment transaction data from SiteMinder to your PMS.

{% hint style="info" %}
**API:** pmsXchange · **Operation:** Payment Transaction Record · **Direction:** SM → PMS · **Method:** Pull (PMS-initiated)
{% endhint %}

## What is Payment Transaction Record?

**Payment Transaction Record** allows a PMS to retrieve reservation payment transaction data. These transactions represent payments made against a reservation using SiteMinder Pay, which facilitates secure payment processing for booking channels and direct bookings through the SiteMinder Platform.

Each payment transaction includes specific details related to the payment and its corresponding reservation. As multiple payments can be processed at different stages of a reservation's lifecycle, these transactions should be treated as a single entity within the PMS.

{% hint style="warning" %}
To implement **Payment Transaction Record**, the PMS must certify for [Reservations PUSH](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations/reservations-push) or [Reservations PULL](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations/reservations-pull).
{% endhint %}

To successfully process Payment Transaction Record, your PMS must handle the following reservation identifiers from the Reservations PUSH or PULL messages:

* The `SiteMinder Reservation ID` (`UniqueID Type="14"`).
* The `Payment Context ID` (`HotelReservationIDResID_Type="34"`), which serves as the master record for all payments linked to a SiteMinder reservation.

{% code title="Where to find the Reservation ID and Payment Context ID in a reservation received from SiteMinder:" expandable="true" %}

```xml
<HotelReservation CreateDateTime="2025-05-12t00:45:23+00:00" ResStatus="Book">
	<!-- HOTEL RESERVATION DETAILS OMITTED -->
	<UniqueID Type="14" ID="ABC-1234567890"/> <!-- SiteMinder Reservation ID -->
	<UniqueID Type="16" ID_Context="MESSAGE_UNIQUE_ID" ID="w81n1qtpmryrvu3g1o"/>
	<!-- HOTEL RESERVATION DETAILS OMITTED -->
	<ResGlobalInfo>
        	<!-- HOTEL RESERVATION DETAILS OMITTED -->
		<HotelReservationIDs>
			<HotelReservationID ResID_Value="1234567890" ResID_Type="14"/>
			<HotelReservationID ResID_Value="7223a92-d988-46b8-8476-3319285af8a2" ResID_Type="34"/> <!-- Payment Context ID -->
		</HotelReservationIDs>
		<!-- HOTEL RESERVATION DETAILS OMITTED -->
		<BasicPropertyInfo HotelCode="HOTELCODE"/>
	</ResGlobalInfo>
</HotelReservation>
```

{% endcode %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>SiteMinder will provide a single global endpoint for all hotels for PMS to send pull requests <code>SM_HotelResPaymentReadRQ</code> and receive payment data responses <code>SM_HotelResPaymentReadRS</code>.</li><li><strong>Test Environment Endpoint:</strong> <a href="https://tpi-pmsx.preprod.siteminderlabs.com/webservices/%7BRequestorID%7D">https://tpi-pmsx.preprod.siteminderlabs.com/webservices/{RequestorID}</a></li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>SiteMinder will provide a single username/password for all hotels (PMS Level authentication).</li><li>PMS must include authentication credentials within the <strong>SOAP Security header</strong> of each request (<code>SM_HotelResPaymentReadRQ</code> and <code>SM_HotelResPaymentResultRQ</code>).</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses will be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li></ul></td></tr></tbody></table>

## Message Exchange Flow

1. **Pull Request (PMS to SiteMinder):** `SM_HotelResPaymentReadRQ`\
   Requests undelivered payment transactions for a specific hotel from SiteMinder.
2. **Payment Data Response (SiteMinder to PMS):** `SM_HotelResPaymentReadRS`\
   Delivers a list of undelivered payment transactions (reserves, charges or refunds) including both card-based and alternative payment methods.
3. **Confirmation Request (PMS to SiteMinder):** `SM_HotelResPaymentResultRQ`\
   Confirms successful storage and processing of payment transactions, or reports processing failures with specific error codes.
4. **Receipt Response (SiteMinder to PMS):** `SM_HotelResPaymentResultRS`\
   Acknowledges the confirmation and marks transactions as delivered (successfully or with errors), removing them from future undelivered pulls.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from your PMS to SiteMinder endpoint. It contains the username and password credentials that we provide to the PMS during integration setup.

**Key Requirements:**

* **Validation**: Our endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Pull Request" %}
Requests must include a SOAP Security Header for authentication.

{% code expandable="true" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<SM_HotelResPaymentReadRQ EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
			<POS>
				<Source>
					<RequestorID Type="22" ID="PMSCODE"/>
				</Source>
			</POS>
			<SelectionCriteria HotelCode="HOTELCODE" SelectionType="Undelivered"/>
		</SM_HotelResPaymentReadRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endcode %}
{% endtab %}

{% tab title="Payment Data Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000"  TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
			<HotelResPaymentList>
				<HotelResPayment TransactionID="09d2db8a-b765-4157-8673-f2beaac02c3f" HotelCode="HOTELCODE" CreateDateTime="2025-08-01T09:30:47+08:00">
					<UniqueID ID="ABC-123456789" Type="14" /> <!-- SiteMinder Reservation ID -->
					<UniqueID ID="7223a92-d988-46b8-8476-3319285af8a2" Type="34" /> <!-- Payment Context ID -->
					<PaymentInfo PaymentTransactionTypeCode="charge" PaymentType="5" Remark="" ChargeTypeCode="RM">
						<PaymentCard CardCode="VI" CardType="1" ExpireDate="1020" Mask="xxxxxxxx2257" CardHolderName="Visa Card HolderName" />
						<PaymentAmount Amount="200.20" CurrencyCode="AUD" />
					</PaymentInfo>
				</HotelResPayment>
				<HotelResPayment TransactionID="09d2db8a-4157-8673-b765-f2beaac02c3f" HotelCode="HOTELCODE" CreateDateTime="2025-08-01T09:35:47+08:00">
					<!-- Payment Transaction Details-->
				</HotelResPayment>
				<!-- Additional Payment Transactions -->
			</HotelResPaymentList>
		</SM_HotelResPaymentReadRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Request" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<SM_HotelResPaymentResultRQ EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
			<HotelResPaymentResult TransactionID="09d2db8a-b765-4157-8673-f2beaac02c3f" HotelCode="HOTELCODE">
				<UniqueID ID="ABC-1234567890" Type="14" /> <!-- SiteMinder Reservation ID -->
				<UniqueID ID="74a63a92-d988-46b8-8476-3319285af8ac" Type="34" /> <!-- Payment Context ID -->
				<UniqueID ID="077887-200098" Type="40" /> <!-- Delivery Confirmation ID -->
			</HotelResPaymentResult>
			<Success/>
		</SM_HotelResPaymentResultRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Receipt Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<SM_HotelResPaymentResultRS EchoToken="123e4567-e89b-12d3-a456-426614174000"  TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
			<Success/>
		</SM_HotelResPaymentResultRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Pull Request**

The PMS uses `SM_HotelResPaymentReadRQ` to pull undelivered payment transactions from SiteMinder at regular intervals between 2-5 minutes. The request frequency must be no more than every 2 minutes (e.g. not every 1 minute) and no less than every 5 minutes (e.g. not every 6 minutes).

{% tabs %}
{% tab title="PMS Level" %}
Returns all undelivered payment transactions for all hotels associated with PMS code: `{PMSCODE}`

**Requirements:** PMS Level authentication.

{% code expandable="true" %}

```xml
<SM_HotelResPaymentReadRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<SelectionCriteria SelectionType="Undelivered"/>
</SM_HotelResPaymentReadRQ>
```

{% endcode %}
{% endtab %}

{% tab title="Hotel Level" %}
Returns all undelivered payment transactions for a specific hotel with code: `{HOTELCODE}`

**Requirements:** Either PMS Level or Hotel Level authentication.

{% code expandable="true" %}

```xml
<SM_HotelResPaymentReadRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<POS>
		<Source>
			<RequestorID Type="22" ID="PMSCODE"/>
		</Source>
	</POS>
	<SelectionCriteria HotelCode="HOTELCODE" SelectionType="Undelivered"/>
</SM_HotelResPaymentReadRQ>
```

{% endcode %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="283">Element / @Attribute</th><th width="133">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>SM_HotelResPaymentReadRQ</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>POS/Source/RequestorID</code></td><td>Element</td><td align="center">1</td><td>Identifies the system which is sending the request. Container for the PMS code.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Fixed at <code>22</code> (ESRP)</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>PMS Code assigned by SiteMinder. Remains the same throughout the messages.</td></tr><tr><td><code>SelectionCriteria</code></td><td>Element</td><td align="center">1</td><td></td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">0..1</td><td>Hotel code as recognised by SiteMinder.</td></tr><tr><td><code>@SelectionType</code></td><td>String</td><td align="center">1</td><td>Must be <code>Undelivered</code></td></tr></tbody></table>

## 2. Payment Data Response

SiteMinder returns `SM_HotelResPaymentReadRS` with undelivered payment transactions. The PMS must push these payment transactions to a queue or event stream for offline processing.

**Transaction Types Returned:**

* **Reserve**: This indicates that a hold for the indicated amount has been placed on a credit card or that a cash amount has been taken from the customer to guarantee final payment.
* **Charge**: This indicates that an actual payment has been made.
* **Refund**: This indicates that the payment amount of this `PaymentInfo` element is for a refund.

{% tabs %}
{% tab title="Card Based Payment Response" %}
{% code expandable="true" %}

```xml
<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000"  TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<HotelResPaymentList>
		<HotelResPayment TransactionID="09d2db8a-b765-4157-8673-f2beaac02c3f" HotelCode="HOTELCODE" CreateDateTime="2025-08-01T09:30:47+08:00">
			<UniqueID ID="ABC-1234567890" Type="14" /> <!-- SiteMinder Reservation ID -->
			<UniqueID ID="7223a92-d988-46b8-8476-3319285af8a2" Type="34" /> <!-- Payment Context ID -->
			<PaymentInfo PaymentTransactionTypeCode="charge" PaymentType="5" Remark="" ChargeTypeCode="RM">
				<PaymentCard CardCode="VI" CardType="1" ExpireDate="1020" Mask="xxxxxxxx2257" CardHolderName="Visa Card HolderName" />
				<PaymentAmount Amount="200.20" CurrencyCode="AUD" />
			</PaymentInfo>
		</HotelResPayment>
		<HotelResPayment TransactionID="09d2db8a-4157-8673-b765-f2beaac02c3f" HotelCode="HOTELCODE" CreateDateTime="2025-08-01T09:30:47+08:00">
			<!-- Payment Transaction Details-->
		</HotelResPayment>
		<!-- Additional Payment Transactions -->
	</HotelResPaymentList>
</SM_HotelResPaymentReadRS>
```

{% endcode %}
{% endtab %}

{% tab title="Non Card Based Payment Response" %}
{% code expandable="true" %}

```xml
<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<HotelResPaymentList>
		<HotelResPayment TransactionID="09d2db8a-b765-4157-8673-f2beaac02c3f" HotelCode="HOTELCODE">
			<UniqueID ID="ABC-1234567890" Type="14" /> <!-- SiteMinder Reservation ID -->
			<UniqueID ID="7223a92-d988-46b8-8476-3319285af8a2" Type="34" /> <!-- Payment Context ID -->
			<PaymentInfo PaymentTransactionTypeCode="charge" PaymentType="46" Remark="alipay" ChargeTypeCode="RM">
				<PaymentAmount Amount="200.20" CurrencyCode="AUD" />
			</PaymentInfo>
		</HotelResPayment>
		<!-- Additional Payment Transactions -->
		<HotelResPayment TransactionID="09d2db8a-4157-8673-b765-f2beaac02c3f" CreateDateTime="2021-08-01T08:49:34.000+0000" HotelCode="HOTELCODE">
			<!-- Payment Transaction Details-->
		</HotelResPayment>
	</HotelResPaymentList>
</SM_HotelResPaymentReadRS>
```

{% endcode %}
{% endtab %}

{% tab title="Empty Payment Response" %}

```xml
<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<HotelResPaymentList/>
</SM_HotelResPaymentReadRS>
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="PMS does not exist" %}
Returned when the PMS Code provided in the endpoint is incorrect.

```xml
<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<Errors>
		<Error Type="4">Authentication failed - PMS does not exist</Error>
	</Errors>
</SM_HotelResPaymentReadRS>
```

{% endtab %}

{% tab title="Invalid username/password" %}
Returned when username and/or password are incorrect.

```xml
<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<Errors>
		<Error Type="4">Authentication failed - PMS received request with invalid username/password</Error>
	</Errors>
</SM_HotelResPaymentReadRS>
```

{% endtab %}

{% tab title="Inconsistent PMS codes" %}
Returned when PMS Code provided in the endpoint and `RequestorID` `ID` are not the same.

```xml
<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<Errors>
		<Error Type="4">Inconsistent PMS codes. PMS “PMSCODE” does not match RequestorID “PMSCODEX”.</Error>
	</Errors>
</SM_HotelResPaymentReadRS>
```

{% endtab %}

{% tab title="Incorrect HotelCode" %}
Returned when `HotelCode` provided is not assigned to any property.

```xml
<SM_HotelResPaymentReadRS EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<Errors>
		<Error Type="6">PMS is not authorized to access hotel with HotelCode=HOTELCODEX</Error>
	</Errors>
</SM_HotelResPaymentReadRS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="282">Element / @Attribute</th><th width="105">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>SM_HotelResPaymentReadRS</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code></td></tr><tr><td><code>HotelResPaymentList</code></td><td>Element</td><td align="center">1</td><td>List of <code>HotelResPayments</code>.</td></tr><tr><td><code>HotelResPayment</code></td><td>Element</td><td align="center">0..n</td><td>HotelResPayment data</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Hotel code as recognised by SiteMinder.</td></tr><tr><td><code>@TransactionID</code></td><td>String</td><td align="center">1</td><td>Transaction Identifier.</td></tr><tr><td><code>@CreateDateTime</code></td><td>DateTime</td><td align="center">1</td><td>Transaction Create timestamp.<br><code>CreateDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">2</td><td></td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Reservation Identifier.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td><p><code>14</code> - Reservation ID</p><p><code>34</code> - Payment Context ID</p></td></tr><tr><td><code>PaymentInfo</code></td><td>Element</td><td align="center">1</td><td></td></tr><tr><td><code>@PaymentTransactionTypeCode</code></td><td>Enumeration</td><td align="center">1</td><td><p><code>reserve</code></p><p><code>charge</code></p><p><code>refund</code></p></td></tr><tr><td><code>@PaymentType</code></td><td>Integer</td><td align="center">1</td><td><p>Identifies the payment type:</p><p><code>5</code> - Credit Card</p><p><code>6</code> - Debit Card</p><p><code>46</code> - Online Payment</p></td></tr><tr><td><code>@Remark</code></td><td>String</td><td align="center">0..1</td><td><p><strong>Card Based:</strong> Open Notes/Remarks.</p><p><strong>Non-Card Based:</strong> Will include the payment provider used.</p></td></tr><tr><td><code>@PaymentRef</code></td><td>String</td><td align="center">0..1</td><td>Payment reference (e.g. Paypal reference).</td></tr><tr><td><code>@ChargeTypeCode</code></td><td>Enumeration</td><td align="center">1</td><td>RM = Room<br>FD = Food/Beverage<br>OT = Other<br>EX = Stay Extras</td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">0..1</td><td>Card Based Payment.</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">1</td><td>2-character code of the credit card issuer. Refer to <a href="https://developer.siteminder.com/siteminder-apis/~/changes/561/additional-resources/reference-tables/payment-card-provider-codes">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@CardType</code></td><td>String</td><td align="center">1</td><td>OTA Card Type<br><code>1</code> - Credit<br><code>2</code> - Debit</td></tr><tr><td><code>@ExpireDate</code></td><td>String</td><td align="center">1</td><td>Expiry date of the credit card (format <code>MMyy</code>).</td></tr><tr><td><code>@Mask</code></td><td>String</td><td align="center">1</td><td>Masked CC number.</td></tr><tr><td><code>@CardHolderName</code></td><td>String</td><td align="center">1</td><td>Name of card holder.</td></tr><tr><td><code>PaymentAmount</code></td><td>Element</td><td align="center">1</td><td>Payment Amount container.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">1</td><td>Transaction amount.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@Due</code></td><td>Decimal</td><td align="center">0..1</td><td>Amount outstanding.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Present if unsuccessfully processed.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1</td><td>Mandatory if Error present. Text must contain a human readable description of the error.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Any code from<a href="/pages/4gDxPCSFeyblWHTelhiH"> Error Codes (ERR)</a></td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">1</td><td>Any type from<a href="/pages/eTWh81Gq6djsnm0unSR4"> Error Warning Types (EWT)</a></td></tr></tbody></table>

## 3. Confirmation Request

The PMS sends `SM_HotelResPaymentResultRQ` to confirms successful storage and processing of payment transactions, or reports processing failures with specific error codes.

#### Unique IDs

To link payments to reservations, an additional ID is now required:

* `UniqueID Type=“14”` (SiteMinder Reservation ID) remains unchanged and continues to identify the individual reservation reference (e.g., `ABC-1234567890`).
* `UniqueID Type=“34”` (Payment Context ID) that identifies the reservation as a whole (not just a message). If a reservation is split across multiple messages, each message will carry the same `Type=“34”` `ID`.

**Grouping Transactions**

`SM_HotelResPaymentReadRS` can return multiple payment transactions at once. However:

* Each `SM_HotelResPaymentResultRQ` must include either `<Success>` or `<Errors>`, never both.
* If some payments succeed and others fail, you must:
  * Send one request with `Success` + IDs of successful transactions.
  * Send another request with `Errors` + IDs of failed transactions.

{% tabs %}
{% tab title="Success" %}

```xml
<SM_HotelResPaymentResultRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
	<HotelResPaymentResult TransactionID="200098" HotelCode="HOTELCODE">
		<UniqueID ID="ABC-1234567890" Type="14" /> <!-- SiteMinder Reservation ID-->
		<UniqueID ID="74a63a92-d988-46b8-8476-3319285af8ac" Type="34" /> <!-- Payment Context ID -->
		<UniqueID ID="077887-200098" Type="40" /> <!-- Delivery Confirmation ID -->
	</HotelResPaymentResult>
	<Success/>
</SM_HotelResPaymentResultRQ>
```

{% endtab %}

{% tab title="Error" %}

```xml
<SM_HotelResPaymentResultRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
   <HotelResPaymentResult TransactionID="200098" HotelCode="HOTELCODE">
        <UniqueID ID="ABC-1234567890" Type="14" /> <!-- Reservation ID-->
        <UniqueID ID="74a63a92-d988-46b8-8476-3319285af8ac" Type="34" /> <!-- Payment Context ID -->
    </HotelResPaymentResult>
    <Errors>
           <Error Type="12" Code="385">Booking reference not found</Error>
    </Errors>
</SM_HotelResPaymentResultRQ>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="286">Element / @Attribute</th><th width="133">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>SM_HotelResPaymentResultRQ</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>HotelResPaymentResult</code></td><td>Element</td><td align="center">0..n</td><td></td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Hotel code as recognised by SiteMinder.</td></tr><tr><td><code>@TransactionID</code></td><td></td><td align="center">1</td><td>Transaction Identifier.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">2..3</td><td></td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Identifier.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">1</td><td><p><code>14</code> - Reservation ID</p><p><code>34</code> - Payment Context ID</p><p><code>40</code> - Delivery Confirmation ID (no returned if <code>Error</code>)<br></p></td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Present if successfully stored and processed</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Present if unsuccessfully processed.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1</td><td>Mandatory if Error present. Text must contain a human readable description of the error.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Any code from<a href="/pages/4gDxPCSFeyblWHTelhiH"> Error Codes (ERR)</a></td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">1</td><td>Any type from<a href="/pages/eTWh81Gq6djsnm0unSR4"> Error Warning Types (EWT)</a></td></tr></tbody></table>

## 4. **Receipt Response**

SiteMinder returns `SM_HotelResPaymentResultRS` with a `Success` message and will internally mark the payment transaction as either successfully delivered or delivered with an error. In both scenarios, the transaction will not be included in future requests for undelivered payment transactions.

{% tabs %}
{% tab title="Success" %}

```xml
<SM_HotelResPaymentResultRS EchoToken="123e4567-e89b-12d3-a456-426614174000" TimeStamp="2025-08-01T09:30:47+08:00" Version="1.0">
    <Success/>
</SM_HotelResPaymentResultRS>
```

{% endtab %}

{% tab title="Unable to update payment" %}
Error returned when `TransactionID` in the `SM_HotelResPaymentReadRS` is not found in our system.

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Server</faultcode>
            <faultstring xml:lang="en">Unable to update payment message status</faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="286">Element / @Attribute</th><th width="133">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>SM_HotelResPaymentResultRS</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Present if successfully stored and processed</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Present If unsuccessfully processed</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1</td><td>Mandatory if Error present. Text can contain a human readable description of the error</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td>Any code from<a href="/pages/4gDxPCSFeyblWHTelhiH"> Error Codes (ERR)</a></td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">1</td><td>Any type from<a href="/pages/eTWh81Gq6djsnm0unSR4"> Error Warning Types (EWT)</a></td></tr></tbody></table>

## Common Questions

<details>

<summary>How often should I pull payment transactions?</summary>

Pull undelivered transactions every 2-5 minutes.

* Minimum frequency: Every 2 minutes (not faster)
* Maximum frequency: Every 5 minutes (not slower)

This ensures timely payment processing without overloading the system.

</details>

<details>

<summary>Can I query for transactions for all properties at the same time?</summary>

Yes, if using PMS-level authentication.

Omit the `HotelCode` parameter in `SM_HotelResPaymentReadRQ` to retrieve all undelivered transactions across all properties associated with your PMS code.

For hotel-level authentication, you must query each property separately by including the `HotelCode`.

</details>

<details>

<summary>Can I query for transactions for a specific reservation?</summary>

No. You can only pull all undelivered transactions per PMS (all hotels) or per hotel.

Use `SM_HotelResPaymentReadRQ` with `SelectionType="Undelivered"` to retrieve all pending transactions, then filter by reservation ID (Type="14" or Type="34") in your PMS.

</details>

<details>

<summary>Where does the value in <code>UniqueID Type="40"</code> come from?</summary>

The PMS creates this value when confirming successful payment processing.

Type="40" (Delivery Confirmation ID) only appears in the `SM_HotelResPaymentResultRQ` message after your PMS successfully stores and processes a payment transaction.

</details>

<details>

<summary>What happens when I don't acknowledge a transaction?</summary>

You have 4 attempts to pull and acknowledge a transaction. After the 4th attempt, SiteMinder marks the delivery as failed.

Your PMS should be able to pull and process multiple pending transactions in each `SM_HotelResPaymentReadRQ` request.

</details>

<details>

<summary>Do I need to acknowledge successful AND failed transactions?</summary>

Yes. Send separate acknowledgments for successful and failed transactions.

* **Success**: Send `SM_HotelResPaymentResultRQ` with `<Success>` + successful transaction IDs
* **Failure**: Send `SM_HotelResPaymentResultRQ` with `<Errors>` + failed transaction IDs

Each acknowledgment must contain only `<Success>` OR `<Errors>`, never both.

</details>

<details>

<summary>What happens to transactions when a reservation is cancelled?</summary>

You may receive additional transactions after cancellation.

Properties can create charges (for cancellation fees) or refunds (for deposit returns) via SiteMinder Pay even after a reservation is cancelled.

Your PMS should continue pulling and processing all pending transactions regardless of reservation status.

</details>

<details>

<summary>Would refunds always cover the entire amount, or are partial refunds possible?</summary>

Partial refunds are possible.

Properties can enter any refund amount through SiteMinder Pay, so your PMS should handle both full and partial refund transactions.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# FAQ

Get answers to frequently asked questions about the pmsXchange API, including features, technical behaviour, and integration details.

### Getting Started

<details>

<summary>How long does pmsXchange integration take?</summary>

Approximately 60 days from initiation to production.

This includes development, testing, certification and pilot phases. For more details review our [Integration Process](broken://pages/RAgwk1sEthWhrn360fiq) guide.

</details>

<details>

<summary>What are the mandatory components to certify in pmsXchange?</summary>

**Required:**

* Rooms and Rates
* Availability
* Reservations (PUSH or PULL)

**Recommended:**

* Restrictions and Rates (PDP or OBP)
* Modifications and Cancellations

**Optional:**

* Reservation Upload, Reservation Import, Payment Transaction Record

</details>

<details>

<summary>What is the difference between Reservations PUSH, PULL, Upload and Import?</summary>

**PUSH (recommended)**: SiteMinder sends reservations to your PMS endpoint in real-time as bookings occur.

**PULL**: Your PMS polls SiteMinder every 2-5 minutes to retrieve new reservations.

**Upload**: Your PMS sends reservations (walk-ins, direct bookings, CRS) to SiteMinder.

**Import**: One-time bulk retrieval of all active reservations during initial PMS setup.

You must certify either PUSH or PULL. Upload and Import are optional add-ons.

</details>

### Authentication

<details>

<summary>What is the difference between PMS-level and hotel-level authentication?</summary>

**PMS-level**: Single credentials for all properties

* Required for REST endpoints (Rooms and Rates)
* Recommended for all integrations
* Use HotelCode to identify each property

**Hotel-level**: Individual credentials per property

* Only available for SOAP/XML messages
* Legacy approach maintained for backward compatibility

</details>

<details>

<summary>What is the difference between HotelCode and Username?</summary>

**HotelCode**: Identifies the specific property in each request

**Username**: Authentication credential used in both SOAP (Security Header) and REST (Basic Auth)

For PMS-level authentication, use the same Username across all properties, with HotelCode identifying each property.

</details>

### Core Concepts

<details>

<summary>What is a delta update?</summary>

Send only the data that changed since your last update.

Delta updates are required in production for all ARI components (Availability, Restrictions, Rates). Only include changed values for specific dates and room/rate combinations - never resend unchanged data.

Full flushes are only permitted during initial setup or when requested by SiteMinder support.

</details>

<details>

<summary>What is the difference between InvTypeCode and RoomTypeCode?</summary>

Both identify the same room type, just used in different message types:

* **InvTypeCode**: Used in inventory updates (availability, restrictions, rates)
* **RoomTypeCode**: Used in reservation messages

Use the `roomTypeCode` from the `room-rates` endpoint for both.

</details>

<details>

<summary>Does pmsXchange support release period?</summary>

No, there is no native release-period field, so a PMS wanting the same functional outcome must send Stop Sell for the release-window dates instead of a dedicated release-period value.

</details>

### Technical Requirements

<details>

<summary>What is HTTP Error 405?</summary>

This error occurs when sending regular HTTP requests (e.g., from a browser) to a SOAP endpoint.

Test connectivity using `OTA_PingRQ` instead of browser requests to verify the service is up and running.

</details>

<details>

<summary>What is TLS Error: Authentication failed because the remote party has closed the transport stream?</summary>

Your system is using an outdated TLS protocol.

Ensure you're using TLS 1.2 or higher. TLS 1.0, TLS 1.1, and all SSL versions are no longer supported due to PCI compliance requirements.

</details>

### Error Handling

<details>

<summary>If I receive an Error back from pmsXchange, will any valid parts of my message be processed?</summary>

No. All messages are atomic - either the entire message succeeds or the entire message fails.

If you receive an Error response, none of the data in that message was processed. Fix the error and resend the complete message.

</details>

<details>

<summary>Why can't I see my ARI changes reflected on SiteMinder Platform even though I receive a successful response?</summary>

Success confirms valid XML and authentication, not that your codes are mapped.

**Common cause:** `InvTypeCode` or `RatePlanCode` not mapped in SiteMinder Platform (Distribution > Connectivities > {PMS Name} > Rooms and Rates Mapping).

Verify mapped codes using the `room-rates` endpoint.

</details>

### Architecture

<details>

<summary>Can SiteMinder sync availability, restrictions, or rates back to my PMS?</summary>

Not currently. pmsXchange uses a PUSH model where your PMS sends all ARI data to SiteMinder.

**Coming soon:** Restrictions and rates will support bidirectional sync, allowing SiteMinder to push changes back to your PMS. Availability will remain PMS-managed only.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Reference Tables

Find reference tables that support your integration with SiteMinder APIs, including technical values, configuration options, and predefined data.


# Booking Agent Codes

Booking agent codes are used to identify the original booking channel associated with a reservation.

This information is included in reservation data exchanged between SiteMinder and PMS systems so that the original booking channel can be correctly identified and interpreted, regardless of where the reservation is processed.\
\ <kbd>**SM network**</kbd> codes represent booking channels that are part of the SiteMinder distribution network and are used when SiteMinder delivers reservations to a PMS.\
\ <kbd>**PMS network**</kbd> codes represent booking channels outside of the SiteMinder distribution network and are used when a PMS uploads reservations to SiteMinder. If a reservation originates from booking channel listed in SM network, those codes should be used instead\
\
Booking agent codes are assigned by SiteMinder for use in reservation data exchange.\
The **Network** column indicates whether the booking channel belongs to the SiteMinder distribution network or the PMS network.

{% hint style="warning" %}
**Important**: If your PMS sends reservations from a booking channel not listed below, you must request a new booking agent code. Contact our **Partner Integrations** or **Ecosystem** team and provide the booking agent name to request code generation before using it.&#x20;
{% endhint %}

{% hint style="success" %}
Check this page regularly for new booking agent codes.
{% endhint %}

<table><thead><tr><th width="100">Code</th><th width="509">Booking Agent / Channel</th><th width="117.0987548828125">Network</th></tr></thead><tbody><tr><td>ABB</td><td>Airbnb</td><td>SM</td></tr><tr><td>ABG</td><td>Abbey Group</td><td>SM</td></tr><tr><td>ABR</td><td>Abreu Online</td><td>SM</td></tr><tr><td>ACO</td><td>Acomodeo</td><td>SM</td></tr><tr><td>ACT</td><td>Action Travel Corp</td><td>SM</td></tr><tr><td>ADR</td><td>Adrez Booking Engine</td><td>SM</td></tr><tr><td>AGO</td><td>Agoda</td><td>SM</td></tr><tr><td>AGY</td><td>Argenway</td><td>SM</td></tr><tr><td>AIA</td><td>AirAsia</td><td>SM</td></tr><tr><td>ALA</td><td>ALARIC</td><td>SM</td></tr><tr><td>ALB</td><td>ALBIE</td><td>SM</td></tr><tr><td>ABT</td><td>Albatravel</td><td>SM</td></tr><tr><td>AGS</td><td>A Good Stay</td><td>SM</td></tr><tr><td>ALE</td><td>AllTours - FIT Res Download (by Eturistic)</td><td>SM</td></tr><tr><td>ALI</td><td>Alidays SpA</td><td>SM</td></tr><tr><td>ALL</td><td>Allocate</td><td>SM</td></tr><tr><td>ANA</td><td>Andalucia Autentica</td><td>SM</td></tr><tr><td>ANX</td><td>Anex Tour Spain</td><td>SM</td></tr><tr><td>ANZ</td><td>ANZCRO</td><td>SM</td></tr><tr><td>AOS</td><td>Asian Overland Services</td><td>SM</td></tr><tr><td>AOT</td><td>AOT Group</td><td>SM</td></tr><tr><td>APL</td><td>Atrapalo</td><td>SM</td></tr><tr><td>ARM</td><td>AurumTours</td><td>SM</td></tr><tr><td>ARO</td><td>AróSuite</td><td>SM</td></tr><tr><td>AST</td><td>Asian Trails</td><td>SM</td></tr><tr><td>ATE</td><td>ATEL Hotels</td><td>SM</td></tr><tr><td>ATG</td><td>AIC Travel Group</td><td>SM</td></tr><tr><td>ATI</td><td>ATI Hotel Web Service</td><td>SM</td></tr><tr><td>ATP</td><td>AlliedTPro</td><td>SM</td></tr><tr><td>ATR</td><td>Altura Destination Services</td><td>SM</td></tr><tr><td>ATT</td><td>ABC Travel Taipei</td><td>SM</td></tr><tr><td>AUR</td><td>Aura.Travel</td><td>SM</td></tr><tr><td>AVT</td><td>AltoVita</td><td>SM</td></tr><tr><td>AVV</td><td>Avvio.com</td><td>SM</td></tr><tr><td>AYO</td><td>AsiaYo</td><td>SM</td></tr><tr><td>BAB</td><td>Bed-and-Breakfast.it</td><td>SM</td></tr><tr><td>BAH</td><td>British Airways Holidays</td><td>SM</td></tr><tr><td>BAS</td><td>Basiyo Services Pvt. Ltd</td><td>PMS</td></tr><tr><td>BBN</td><td>Direct Booking</td><td>SM</td></tr><tr><td>BBP</td><td>BookingButton Plus</td><td>SM</td></tr><tr><td>BBS</td><td>BookingButton Sapphire Coast</td><td>SM</td></tr><tr><td>BCC</td><td>Bookerclub.com</td><td>SM</td></tr><tr><td>BDC</td><td>Booking.com</td><td>SM</td></tr><tr><td>BEH</td><td>Beth</td><td>SM</td></tr><tr><td>BHA</td><td>Bing Hotel Ads</td><td>SM</td></tr><tr><td>BIC</td><td>NextTrip</td><td>SM</td></tr><tr><td>BKC</td><td>BookingCore</td><td>SM</td></tr><tr><td>BKE</td><td>Bookeasy/Bookit</td><td>SM</td></tr><tr><td>BKL</td><td>Bookolo</td><td>SM</td></tr><tr><td>BKN</td><td>Bakuun / RateDock</td><td>SM</td></tr><tr><td>BKS</td><td>Bookassist</td><td>SM</td></tr><tr><td>BLC</td><td>BookLogic</td><td>PMS</td></tr><tr><td>BNB</td><td>BnBerry</td><td>SM</td></tr><tr><td>BNO</td><td>Bonotel</td><td>SM</td></tr><tr><td>BOK</td><td>BookVisit | Citybreak | Nozio</td><td>SM</td></tr><tr><td>BON</td><td>Bookonlinenow</td><td>SM</td></tr><tr><td>BRC</td><td>Busy Rooms CRS</td><td>SM</td></tr><tr><td>BTH</td><td>Booking2Hotels</td><td>SM</td></tr><tr><td>BWE</td><td>Bedswithease</td><td>SM</td></tr><tr><td>BWS</td><td>Best Western CRSConnect</td><td>SM</td></tr><tr><td>BWZ</td><td>BookingWhizz</td><td>SM</td></tr><tr><td>CAE</td><td>hotline hotel software booking system</td><td>SM</td></tr><tr><td>CAM</td><td>Vacanceselect Travel</td><td>SM</td></tr><tr><td>CCA</td><td>BookingPal</td><td>SM</td></tr><tr><td>CCK</td><td>CHECK24</td><td>SM</td></tr><tr><td>CCT</td><td>BookingButton Cradle Coast Tourism</td><td>SM</td></tr><tr><td>CDR</td><td>centraldereservas.com</td><td>SM</td></tr><tr><td>CDV</td><td>Club de Vacaciones</td><td>SM</td></tr><tr><td>CFT</td><td>Colatour Travel</td><td>SM</td></tr><tr><td>CHC</td><td>Acomos Staybooked</td><td>SM</td></tr><tr><td>CHM</td><td>Charming Italy</td><td>SM</td></tr><tr><td>CHO</td><td>CHOICE CRSConnect</td><td>SM</td></tr><tr><td>CHP</td><td>Channels Plus</td><td>SM</td></tr><tr><td>CIS</td><td>Cisalpina Tours</td><td>SM</td></tr><tr><td>CLB</td><td>Cloudbeds</td><td>PMS</td></tr><tr><td>CLD</td><td>GuestPro</td><td>SM</td></tr><tr><td>CLO</td><td>Ctoutvert</td><td>SM</td></tr><tr><td>CLT</td><td>CultBooking</td><td>SM</td></tr><tr><td>CNC</td><td>CONNECTYCS (The Finlei &#x26; Connectycs Company)</td><td>SM</td></tr><tr><td>CNT</td><td>CNTravel</td><td>SM</td></tr><tr><td>CRC</td><td>Corporate Rates Club</td><td>SM</td></tr><tr><td>CSV</td><td>Clearing Station (Vioma)</td><td>SM</td></tr><tr><td>CTG</td><td>CNBooking.net</td><td>SM</td></tr><tr><td>CTH</td><td>CTM Sleep Space</td><td>SM</td></tr><tr><td>CTM</td><td>BookMe Maldives</td><td>SM</td></tr><tr><td>CTP</td><td>Trip.com (Old)</td><td>SM</td></tr><tr><td>CUR</td><td>Curacity</td><td>SM</td></tr><tr><td>CZB</td><td>Cityzenbooking</td><td>SM</td></tr><tr><td>DAD</td><td>Daydreams</td><td>SM</td></tr><tr><td>DAT</td><td>1way2italy</td><td>SM</td></tr><tr><td>DBH</td><td>DayBreakHotels</td><td>SM</td></tr><tr><td>DBL</td><td>Dubai Link</td><td>SM</td></tr><tr><td>DDC</td><td>Despegar.com</td><td>SM</td></tr><tr><td>DED</td><td>D-EDGE (New)</td><td>SM</td></tr><tr><td>DER</td><td>DER Touristik</td><td>SM</td></tr><tr><td>DGB</td><td>Digibreaks</td><td>SM</td></tr><tr><td>DIC</td><td>Discover Australia Contract</td><td>SM</td></tr><tr><td>DID</td><td>DidaTravel</td><td>SM</td></tr><tr><td>DIP</td><td>Discover Australia Package</td><td>SM</td></tr><tr><td>DIS</td><td>Discover Australia</td><td>SM</td></tr><tr><td>DIT</td><td>Destination Italia</td><td>SM</td></tr><tr><td>DJO</td><td>Djoca Travel</td><td>SM</td></tr><tr><td>DMC</td><td>Top Atlantico DMC</td><td>SM</td></tr><tr><td>DOW</td><td>WebBeds - Destinations of the World</td><td>SM</td></tr><tr><td>DRM</td><td>Dorms.com</td><td>SM</td></tr><tr><td>DRS</td><td>DIRS21</td><td>SM</td></tr><tr><td>DTE</td><td>DERTUR DTServices - FIT Res Download (Eturistic)</td><td>SM</td></tr><tr><td>DTS</td><td>Dieux Travel Services</td><td>SM</td></tr><tr><td>EBW</td><td>Easybooking by Webconnection</td><td>SM</td></tr><tr><td>ECH</td><td>EcoHotels.com</td><td>SM</td></tr><tr><td>ECL</td><td>EC Travel</td><td>SM</td></tr><tr><td>ECT</td><td>followme2AFRICA</td><td>SM</td></tr><tr><td>EDH</td><td>ED for hotels</td><td>SM</td></tr><tr><td>EDR</td><td>ODIGEO Connect</td><td>SM</td></tr><tr><td>EET</td><td>Egypt Express Travel</td><td>SM</td></tr><tr><td>EEX</td><td>Europe Express</td><td>SM</td></tr><tr><td>EHX</td><td>eHotelXml</td><td>SM</td></tr><tr><td>EJT</td><td>Easyjet Holidays</td><td>SM</td></tr><tr><td>EJE</td><td>Easyjet Holidays - FIT Res Download (by Eturistic)</td><td>SM</td></tr><tr><td>ELV</td><td>Elevate DMC</td><td>SM</td></tr><tr><td>EMA</td><td>BookingEye</td><td>SM</td></tr><tr><td>EMT</td><td>EaseMyTrip</td><td>SM</td></tr><tr><td>ESA</td><td>Estonian Spa Association</td><td>SM</td></tr><tr><td>ESB</td><td>AlphaRed GHS</td><td>SM</td></tr><tr><td>ESC</td><td>Escalabeds</td><td>SM</td></tr><tr><td>ESQ</td><td>Esquiades</td><td>SM</td></tr><tr><td>EST</td><td>Estiber</td><td>SM</td></tr><tr><td>ETL</td><td>EasyTravel</td><td>SM</td></tr><tr><td>ETO</td><td>eTourism</td><td>SM</td></tr><tr><td>ETT</td><td>Eurotours International</td><td>SM</td></tr><tr><td>ETV</td><td>EasyTravel(D2C)</td><td>SM</td></tr><tr><td>EUP</td><td>Europlayas</td><td>SM</td></tr><tr><td>EVO</td><td>evoSuite</td><td>SM</td></tr><tr><td>EXP</td><td>Expedia</td><td>SM</td></tr><tr><td>EZL</td><td>EZLINK HOTELS</td><td>SM</td></tr><tr><td>EZT</td><td>ezTravel</td><td>SM</td></tr><tr><td>FAS</td><td>FastPayHotels</td><td>SM</td></tr><tr><td>FBK</td><td>D-EDGE (Old)</td><td>SM</td></tr><tr><td>FCH</td><td>fincahotels.com</td><td>SM</td></tr><tr><td>FEL</td><td>Feelingo</td><td>SM</td></tr><tr><td>FER</td><td>feratel Deskline</td><td>SM</td></tr><tr><td>FGG</td><td>Fliggy (New)</td><td>SM</td></tr><tr><td>FHO</td><td>Fusion Holidays</td><td>SM</td></tr><tr><td>FIN</td><td>Finnair</td><td>SM</td></tr><tr><td>FLG</td><td>Fliggy (Old)</td><td>SM</td></tr><tr><td>FTR</td><td>Flow</td><td>SM</td></tr><tr><td>GBB</td><td>Goibibo &#x26; MakeMyTrip</td><td>SM</td></tr><tr><td>GBR</td><td>grabrooms</td><td>SM</td></tr><tr><td>GCC</td><td>GuestCentric Systems</td><td>SM</td></tr><tr><td>GCR</td><td>GuestCentric Rewards</td><td>SM</td></tr><tr><td>GCS</td><td>GuestCentric Channels</td><td>SM</td></tr><tr><td>GEN</td><td>SiteMinder GDS</td><td>SM</td></tr><tr><td>GFT</td><td>Go4Travel</td><td>SM</td></tr><tr><td>GHF</td><td>Google Hotel Ads (CPC)</td><td>SM</td></tr><tr><td>GIC</td><td>Guest Incoming</td><td>SM</td></tr><tr><td>GIM</td><td>BookingenGIMH</td><td>SM</td></tr><tr><td>GLA</td><td>Glamping Hub</td><td>SM</td></tr><tr><td>GLN</td><td>Guestline</td><td>PMS</td></tr><tr><td>GMH</td><td>GIMH</td><td>SM</td></tr><tr><td>GNA</td><td>GNA Hotel Solutions</td><td>SM</td></tr><tr><td>GOA</td><td>Go2Africa</td><td>SM</td></tr><tr><td>GOB</td><td>Gobooking</td><td>SM</td></tr><tr><td>GOT</td><td>Grupo Opentours</td><td>SM</td></tr><tr><td>GPO</td><td>GuestPro Revenue Booster</td><td>SM</td></tr><tr><td>GRN</td><td>GreenBooking.Engine</td><td>SM</td></tr><tr><td>GRP</td><td>Groupon Getaways</td><td>SM</td></tr><tr><td>GRT</td><td>Grosvenor Tours</td><td>SM</td></tr><tr><td>GSR</td><td>GuestBook - Boutique Hospitality Booking System</td><td>SM</td></tr><tr><td>GTT</td><td>G2 Travel</td><td>SM</td></tr><tr><td>HAB</td><td>SilverDoor</td><td>SM</td></tr><tr><td>HAF</td><td>HafH</td><td>SM</td></tr><tr><td>HAN</td><td>HanaTour</td><td>SM</td></tr><tr><td>HAW</td><td>HousingAnywhere</td><td>SM</td></tr><tr><td>HBD</td><td>Hotelbeds</td><td>SM</td></tr><tr><td>HCM</td><td>Hotelchamp</td><td>PMS</td></tr><tr><td>HDT</td><td>Hotel Direct</td><td>SM</td></tr><tr><td>HEI</td><td>HEIDI (SKIZOOM)</td><td>SM</td></tr><tr><td>HEX</td><td>HotelExchange</td><td>SM</td></tr><tr><td>HFT</td><td>House of Travel</td><td>SM</td></tr><tr><td>HGO</td><td>hutchgo.com Partner Portal</td><td>SM</td></tr><tr><td>HIK</td><td>Hikari Global</td><td>SM</td></tr><tr><td>HIS</td><td>Hotelsinone</td><td>SM</td></tr><tr><td>HJZ</td><td>Hoojoozat</td><td>SM</td></tr><tr><td>HKC</td><td>Hong Kong Convergent</td><td>SM</td></tr><tr><td>HKT</td><td>HongKong Tuyi</td><td>SM</td></tr><tr><td>HKU</td><td>HOOKUSBOOKUS.COM</td><td>SM</td></tr><tr><td>HLB</td><td>HalalBooking</td><td>SM</td></tr><tr><td>HLP</td><td>HPro Travel / GoGlobal</td><td>SM</td></tr><tr><td>HLS</td><td>Hoteliers.com</td><td>SM</td></tr><tr><td>HNS</td><td>HotelNetSolutions</td><td>SM</td></tr><tr><td>HNT</td><td>Hotelnet</td><td>SM</td></tr><tr><td>HOM</td><td>Homair Vacances</td><td>SM</td></tr><tr><td>HOP</td><td>Hopper</td><td>SM</td></tr><tr><td>HOS</td><td>HotelSpecials</td><td>SM</td></tr><tr><td>HPA</td><td>Hotelpass</td><td>SM</td></tr><tr><td>HPG</td><td>HyperGuest</td><td>SM</td></tr><tr><td>HPN</td><td>HotelPlanner</td><td>SM</td></tr><tr><td>HPO</td><td>HotelPro IBE</td><td>SM</td></tr><tr><td>HRS</td><td>HRS - Hotel Reservation Service</td><td>SM</td></tr><tr><td>HRT</td><td>Hero Travel</td><td>SM</td></tr><tr><td>HSC</td><td>HostelsClub</td><td>SM</td></tr><tr><td>HSP</td><td>HotelshopUK</td><td>SM</td></tr><tr><td>HSW</td><td>HotelSwaps</td><td>SM</td></tr><tr><td>HTA</td><td>Hotel Trader</td><td>SM</td></tr><tr><td>HTI</td><td>Holiday Travel Group</td><td>SM</td></tr><tr><td>HTN</td><td>HotelTonight</td><td>SM</td></tr><tr><td>HTP</td><td>Hoterip</td><td>SM</td></tr><tr><td>HTT</td><td>Hotetec</td><td>SM</td></tr><tr><td>HUA</td><td>Hua Min Tourism Reservation</td><td>SM</td></tr><tr><td>HUR</td><td>HURB (Hotel Urbano)</td><td>SM</td></tr><tr><td>HUS</td><td>Keytel GDS</td><td>SM</td></tr><tr><td>HWG</td><td>HostelWorld Group (NEW)</td><td>SM</td></tr><tr><td>HWL</td><td>Hostelworld Group (OLD)</td><td>SM</td></tr><tr><td>HWR</td><td>Hotwire</td><td>SM</td></tr><tr><td>HYM</td><td>HotelPartner YM</td><td>SM</td></tr><tr><td>IBK</td><td>GHS iBooking</td><td>SM</td></tr><tr><td>ICI</td><td>iCastelli.net</td><td>SM</td></tr><tr><td>IDO</td><td>Idiso</td><td>SM</td></tr><tr><td>IES</td><td>i-escape</td><td>SM</td></tr><tr><td>IHW</td><td>iHotelier</td><td>SM</td></tr><tr><td>IMP</td><td>ImperaTours</td><td>SM</td></tr><tr><td>INF</td><td>Infinite Hotel</td><td>SM</td></tr><tr><td>INS</td><td>Instant Bookings</td><td>SM</td></tr><tr><td>INZ</td><td>Open Travel</td><td>SM</td></tr><tr><td>IOS</td><td>In1 Solutions</td><td>SM</td></tr><tr><td>IPB</td><td>iperbooking</td><td>SM</td></tr><tr><td>IPK</td><td>NOL Interpark</td><td>SM</td></tr><tr><td>IRU</td><td>Event Direct Booking by Ireckonu</td><td>SM</td></tr><tr><td>ITL</td><td>AzoresGetaways.com</td><td>SM</td></tr><tr><td>ITP</td><td>Inntopia</td><td>SM</td></tr><tr><td>IVU</td><td>IVIVU.com</td><td>SM</td></tr><tr><td>IXP</td><td>IXPIRA</td><td>SM</td></tr><tr><td>JLT</td><td>JL-Tour</td><td>SM</td></tr><tr><td>JMB</td><td>Jumbonline</td><td>SM</td></tr><tr><td>JTB</td><td>JTB Hawaii</td><td>SM</td></tr><tr><td>JTG</td><td>JTB Group</td><td>SM</td></tr><tr><td>JTH</td><td>Jet2holidays</td><td>SM</td></tr><tr><td>JTP</td><td>Jet2holidays Packages</td><td>SM</td></tr><tr><td>JYH</td><td>Journey Hospitality</td><td>SM</td></tr><tr><td>KAK</td><td>Kake Travel</td><td>SM</td></tr><tr><td>KAR</td><td>Karpaten Turism</td><td>SM</td></tr><tr><td>KEY</td><td>Keytel - Phoenix</td><td>SM</td></tr><tr><td>KHS</td><td>Klook</td><td>SM</td></tr><tr><td>KHT</td><td>Kaluah Tours</td><td>SM</td></tr><tr><td>KKD</td><td>KKday</td><td>SM</td></tr><tr><td>KMW</td><td>kurz-mal-weg.de</td><td>SM</td></tr><tr><td>KNB</td><td>KliknBook</td><td>SM</td></tr><tr><td>KOE</td><td>Digitrips HDA</td><td>SM</td></tr><tr><td>KRZ</td><td>Kurzurlaub</td><td>SM</td></tr><tr><td>KTL</td><td>Keytel</td><td>SM</td></tr><tr><td>LDO</td><td>HRS Australasia</td><td>SM</td></tr><tr><td>LEA</td><td>LEAN</td><td>SM</td></tr><tr><td>LKK</td><td>LekkeSlaap</td><td>SM</td></tr><tr><td>LMT</td><td>LimaTours</td><td>SM</td></tr><tr><td>LNT</td><td>Lion Travel Hotel System</td><td>SM</td></tr><tr><td>LOV</td><td>LoveHolidays</td><td>SM</td></tr><tr><td>LTE</td><td>Travel Essence / Little Travel Europe</td><td>SM</td></tr><tr><td>LTM</td><td>Latam Travel</td><td>SM</td></tr><tr><td>LTS</td><td>YouXia</td><td>SM</td></tr><tr><td>LXE</td><td>Luxury Escapes</td><td>SM</td></tr><tr><td>LXR</td><td>LuxuryRes</td><td>SM</td></tr><tr><td>LYC</td><td>Ly.com</td><td>SM</td></tr><tr><td>MAB</td><td>Mandira Abadi</td><td>SM</td></tr><tr><td>MAL</td><td>Mister Aladin</td><td>SM</td></tr><tr><td>MAN</td><td>ManleyTravel</td><td>SM</td></tr><tr><td>MAX</td><td>OpenGDS</td><td>SM</td></tr><tr><td>MCP</td><td>Mitchell Corp Ezibed.com</td><td>SM</td></tr><tr><td>MCW</td><td>Mitchell Corp Wholesale</td><td>SM</td></tr><tr><td>MEW</td><td>Mews Booking Engine</td><td>PMS</td></tr><tr><td>MDR</td><td>Macdonald Resorts</td><td>SM</td></tr><tr><td>MGA</td><td>Magic Arabia</td><td>SM</td></tr><tr><td>MGK</td><td>MG bedbank</td><td>SM</td></tr><tr><td>MHB</td><td>MyHotelBreak.com (Classic Britain)</td><td>SM</td></tr><tr><td>MMS</td><td>Mr and Mrs Smith</td><td>SM</td></tr><tr><td>MOM</td><td>Momorooms by Lastminute</td><td>SM</td></tr><tr><td>MRI</td><td>Mirai</td><td>SM</td></tr><tr><td>MRP</td><td>MiraiPro(Agencies)</td><td>SM</td></tr><tr><td>MRS</td><td>MyERes.com</td><td>SM</td></tr><tr><td>MRT</td><td>Myrealtrip</td><td>SM</td></tr><tr><td>MTC</td><td>MTC Group SA</td><td>SM</td></tr><tr><td>MTG</td><td>Mustgo</td><td>SM</td></tr><tr><td>MTL</td><td>MIKI Travel</td><td>SM</td></tr><tr><td>MTN</td><td>Meituan</td><td>SM</td></tr><tr><td>MTS</td><td>MTS - FIT Res Download (by Eturistic)</td><td>SM</td></tr><tr><td>MYT</td><td>MyTour HMS</td><td>SM</td></tr><tr><td>MYX</td><td>Xcaliber</td><td>SM</td></tr><tr><td>NAB</td><td>Net Affinity V2</td><td>SM</td></tr><tr><td>NAM</td><td>NamuTravel</td><td>SM</td></tr><tr><td>NAY</td><td>NetAffinity</td><td>SM</td></tr><tr><td>NBI</td><td>NB Incoming Services</td><td>SM</td></tr><tr><td>NBK</td><td>Neobookings</td><td>SM</td></tr><tr><td>NFT</td><td>Fine Tours Group</td><td>SM</td></tr><tr><td>NMO</td><td>Nomolesten.com</td><td>SM</td></tr><tr><td>NRL</td><td>Rezlive.com (NEW)</td><td>SM</td></tr><tr><td>NST</td><td>Blueground</td><td>SM</td></tr><tr><td>NTN</td><td>World 2 Meet</td><td>SM</td></tr><tr><td>NUT</td><td>Nuitee (Direct)</td><td>SM</td></tr><tr><td>NWT</td><td>New World Travel</td><td>SM</td></tr><tr><td>NXS</td><td>Nexus Tours</td><td>SM</td></tr><tr><td>OBE</td><td>ObeHotel</td><td>SM</td></tr><tr><td>ODE</td><td>Odeon Tours</td><td>SM</td></tr><tr><td>ODI</td><td>Odisseias</td><td>SM</td></tr><tr><td>ODX</td><td>ETStur</td><td>SM</td></tr><tr><td>OFH</td><td>Orchestra4Hotels</td><td>SM</td></tr><tr><td>OHR</td><td>1HotelRez</td><td>SM</td></tr><tr><td>OLV</td><td>Olympia Europe</td><td>SM</td></tr><tr><td>OMH</td><td>OhMyHotel</td><td>SM</td></tr><tr><td>OMI</td><td>Omni Hotelier</td><td>SM</td></tr><tr><td>OMN</td><td>Omnimentum</td><td>SM</td></tr><tr><td>ONB</td><td>OnetBooking</td><td>SM</td></tr><tr><td>OND</td><td>ONDA</td><td>SM</td></tr><tr><td>ONT</td><td>On Travel Solutions</td><td>SM</td></tr><tr><td>OPL</td><td>Off Peak Luxury</td><td>SM</td></tr><tr><td>OPN</td><td>ONE</td><td>SM</td></tr><tr><td>OPR</td><td>OpenROOM</td><td>SM</td></tr><tr><td>OTB</td><td>On the Beach Beds Limited</td><td>SM</td></tr><tr><td>OTS</td><td>Open Travel Service</td><td>SM</td></tr><tr><td>OTZ</td><td>otelz.com</td><td>SM</td></tr><tr><td>OUT</td><td>One-Up Travel</td><td>SM</td></tr><tr><td>OVK</td><td>Emerging Travel Inc</td><td>SM</td></tr><tr><td>OWD</td><td>Our World</td><td>SM</td></tr><tr><td>OZA</td><td>Ozaccom+</td><td>SM</td></tr><tr><td>OZC</td><td>OzAccom+ (NEW)</td><td>SM</td></tr><tr><td>PBB</td><td>Pacific BedBank</td><td>SM</td></tr><tr><td>PDV</td><td>Panamericana de Viajes DMC</td><td>SM</td></tr><tr><td>PKF</td><td>PKFare</td><td>SM</td></tr><tr><td>PLY</td><td>Play In One</td><td>SM</td></tr><tr><td>PMB</td><td>Pays du Mont Blanc</td><td>SM</td></tr><tr><td>PMR</td><td>Portimar</td><td>SM</td></tr><tr><td>POW</td><td>powernapp.com</td><td>SM</td></tr><tr><td>PPN</td><td>Pan Pacific Travel</td><td>SM</td></tr><tr><td>PRC</td><td>PriceTravel (New)</td><td>SM</td></tr><tr><td>PRF</td><td>Profitroom</td><td>SM</td></tr><tr><td>PRL</td><td>Perlatours</td><td>SM</td></tr><tr><td>PRT</td><td>Tidesquare</td><td>SM</td></tr><tr><td>PTB</td><td>Prime Travel / Bedsopia</td><td>SM</td></tr><tr><td>PTC</td><td>P.T.C Express Travel</td><td>SM</td></tr><tr><td>PTH</td><td>Paraty Hotels</td><td>SM</td></tr><tr><td>PTK</td><td>Pegas Touristik</td><td>SM</td></tr><tr><td>PTL</td><td>PriceTravel (Old)</td><td>SM</td></tr><tr><td>PTR</td><td>Profit Travel B2B</td><td>SM</td></tr><tr><td>PUP</td><td>Pitchup.com</td><td>SM</td></tr><tr><td>QBD</td><td>Flight Centre Travel Group</td><td>SM</td></tr><tr><td>QHH</td><td>Qantas/Jetstar Hotels &#x26; Holidays</td><td>SM</td></tr><tr><td>QRS</td><td>Quantum Reservations</td><td>SM</td></tr><tr><td>QYJ</td><td>Qiyouji</td><td>SM</td></tr><tr><td>RAC</td><td>RACV Travel and Experiences</td><td>SM</td></tr><tr><td>RAK</td><td>Rakuten - Non-Domestic (Old)</td><td>SM</td></tr><tr><td>RAT</td><td>Openhotelier</td><td>SM</td></tr><tr><td>RBS</td><td>Roibos</td><td>SM</td></tr><tr><td>RBT</td><td>Roombeast</td><td>SM</td></tr><tr><td>RCI</td><td>RCI</td><td>SM</td></tr><tr><td>RCL</td><td>Reconline AG</td><td>SM</td></tr><tr><td>REH</td><td>Rehlat</td><td>SM</td></tr><tr><td>REV</td><td>Revenatium</td><td>SM</td></tr><tr><td>RFA</td><td>Roamfree</td><td>SM</td></tr><tr><td>RGL</td><td>Regal</td><td>SM</td></tr><tr><td>RKT</td><td>Rakuten Travel Xchange</td><td>SM</td></tr><tr><td>RLB</td><td>Railbookers Group</td><td>SM</td></tr><tr><td>RLG</td><td>ResLogic</td><td>SM</td></tr><tr><td>RLT</td><td>Resort Life Travel</td><td>SM</td></tr><tr><td>RMC</td><td>RMS Cloud</td><td>PMS</td></tr><tr><td>RMS</td><td>RoomStay</td><td>SM</td></tr><tr><td>RMT</td><td>RateMatch</td><td>SM</td></tr><tr><td>ROI</td><td>Roiback</td><td>SM</td></tr><tr><td>ROM</td><td>Roomex</td><td>SM</td></tr><tr><td>ROS</td><td>RocketStay</td><td>SM</td></tr><tr><td>RPR</td><td>Riparide</td><td>SM</td></tr><tr><td>RRN</td><td>RoomRaccoon</td><td>PMS</td></tr><tr><td>RRZ</td><td>Ripe</td><td>SM</td></tr><tr><td>RSD</td><td>Tripster</td><td>SM</td></tr><tr><td>RTL</td><td>Beds4Travel</td><td>SM</td></tr><tr><td>RTS</td><td>Kognitiv</td><td>SM</td></tr><tr><td>RTX</td><td>Rakuten - Non-Domestic (NEW)</td><td>SM</td></tr><tr><td>RVC</td><td>RevChill</td><td>SM</td></tr><tr><td>RVG</td><td>Cendyn RVNG CRS</td><td>SM</td></tr><tr><td>RVH</td><td>Reserv by Tambourine</td><td>SM</td></tr><tr><td>RVP</td><td>GuestLeader</td><td>SM</td></tr><tr><td>RWD</td><td>Rewards Corp</td><td>SM</td></tr><tr><td>RYD</td><td>Goelett</td><td>SM</td></tr><tr><td>SAH</td><td>South African Hotels</td><td>SM</td></tr><tr><td>SAN</td><td>Travelstart</td><td>SM</td></tr><tr><td>SBB</td><td>Spa Breaks</td><td>SM</td></tr><tr><td>SBX</td><td>Smartbox Group</td><td>SM</td></tr><tr><td>SDB</td><td>SpeedyBooker.com</td><td>SM</td></tr><tr><td>SDT</td><td>SideTours - FIT Res Download (by Eturistic)</td><td>SM</td></tr><tr><td>SEM</td><td>Sembo</td><td>SM</td></tr><tr><td>SEN</td><td>Sentinel</td><td>SM</td></tr><tr><td>SER</td><td>Serhs Tourism</td><td>SM</td></tr><tr><td>SES</td><td>Secret Escapes</td><td>SM</td></tr><tr><td>SHE</td><td>Shenzhen Chunqiu Travel Agency</td><td>SM</td></tr><tr><td>SHJ</td><td>Shiji - WeChat</td><td>SM</td></tr><tr><td>SHR</td><td>Stash Hotel Rewards</td><td>SM</td></tr><tr><td>SIT</td><td>Sidetours</td><td>SM</td></tr><tr><td>SMA</td><td>SmartHOTEL BV</td><td>SM</td></tr><tr><td>SMP</td><td>Simple Booking</td><td>SM</td></tr><tr><td>SMR</td><td>Spar mit! Reisen</td><td>SM</td></tr><tr><td>SNH</td><td>SilverNeedle IBE</td><td>SM</td></tr><tr><td>SOL</td><td>Solferias</td><td>SM</td></tr><tr><td>SPA</td><td>Springbok Atlas</td><td>SM</td></tr><tr><td>SQR</td><td>Thesqua.re</td><td>SM</td></tr><tr><td>SRA</td><td>Almosafer</td><td>SM</td></tr><tr><td>SRV</td><td>Sirvoy</td><td>PMS</td></tr><tr><td>SST</td><td>Sun Series Travel</td><td>SM</td></tr><tr><td>STC</td><td>STC Hoteldata</td><td>SM</td></tr><tr><td>STR</td><td>Soliterra DMC</td><td>SM</td></tr><tr><td>STU</td><td>SITU</td><td>SM</td></tr><tr><td>STY</td><td>Staycation</td><td>SM</td></tr><tr><td>SUN</td><td>WebBeds - Sunhotels</td><td>SM</td></tr><tr><td>SWB</td><td>Sunweb Group</td><td>SM</td></tr><tr><td>SYN</td><td>Synergy</td><td>SM</td></tr><tr><td>SYX</td><td>SynXis</td><td>SM</td></tr><tr><td>SZA</td><td>Szallasvadasz</td><td>SM</td></tr><tr><td>SZS</td><td>Szallas.hu | Noclegi.pl</td><td>SM</td></tr><tr><td>TAD</td><td>TripADeal</td><td>SM</td></tr><tr><td>TAM</td><td>TeamAmerica</td><td>SM</td></tr><tr><td>TAN</td><td>TA Network</td><td>SM</td></tr><tr><td>TAV</td><td>Travia Marketplace</td><td>SM</td></tr><tr><td>TBH</td><td>Tablet Hotels</td><td>SM</td></tr><tr><td>TBL</td><td>TravelBullz</td><td>SM</td></tr><tr><td>TBO</td><td>TBOHolidays</td><td>SM</td></tr><tr><td>TDM</td><td>Tourvest Destination Management</td><td>SM</td></tr><tr><td>TDN</td><td>Time Design</td><td>SM</td></tr><tr><td>TDS</td><td>TDS (Travel Destination Solutions)</td><td>SM</td></tr><tr><td>TDT</td><td>TourDiez Travel</td><td>SM</td></tr><tr><td>TDZ</td><td>Tour10</td><td>SM</td></tr><tr><td>TEA</td><td>Tourism eXchange Australia</td><td>SM</td></tr><tr><td>TEI</td><td>Tourism eXchange Saudi</td><td>SM</td></tr><tr><td>TEM</td><td>TUI Dynamic - European Markets</td><td>SM</td></tr><tr><td>TES</td><td>Tourism eXchange USA</td><td>SM</td></tr><tr><td>TEU</td><td>Tourism eXchange Great Britain</td><td>SM</td></tr><tr><td>TFA</td><td>Travel Funders Network (New)</td><td>SM</td></tr><tr><td>TFN</td><td>Travel Funders Network (Old)</td><td>SM</td></tr><tr><td>THA</td><td>Thompsons Africa</td><td>SM</td></tr><tr><td>THO</td><td>The Hotel Network</td><td>SM</td></tr><tr><td>THR</td><td>ThinkReservations</td><td>PMS</td></tr><tr><td>TIB</td><td>Tripadvisor Plus / Instant Booking</td><td>SM</td></tr><tr><td>TIP</td><td>Trip.com(New)</td><td>SM</td></tr><tr><td>TKH</td><td>Booking Direct</td><td>SM</td></tr><tr><td>TKT</td><td>Tiket.com</td><td>SM</td></tr><tr><td>TLB</td><td>Tailorbeds</td><td>SM</td></tr><tr><td>TLE</td><td>Tumlare</td><td>SM</td></tr><tr><td>TLS</td><td>Travalco USA Inc.</td><td>SM</td></tr><tr><td>TMD</td><td>Tourmind</td><td>SM</td></tr><tr><td>TMK</td><td>tripmakery</td><td>SM</td></tr><tr><td>TMP</td><td>Travel Compositor</td><td>SM</td></tr><tr><td>TMS</td><td>Holidu Smart Destination</td><td>SM</td></tr><tr><td>TNA</td><td>TourMappers North America</td><td>SM</td></tr><tr><td>TOA</td><td>CVC Brasil Operadora</td><td>SM</td></tr><tr><td>TOH</td><td>Thompsons Holidays</td><td>SM</td></tr><tr><td>TOP</td><td>Toptown Shanghai</td><td>SM</td></tr><tr><td>TPL</td><td>Tourplan</td><td>SM</td></tr><tr><td>TRA</td><td>Tripadvisor Cost-Per-Click</td><td>SM</td></tr><tr><td>TRC</td><td>Wink</td><td>SM</td></tr><tr><td>TRG</td><td>Lastminute.com (Old)</td><td>SM</td></tr><tr><td>LMS</td><td>Lastminute.com (New)</td><td>SM</td></tr><tr><td>TRI</td><td>ITRIP LLC</td><td>SM</td></tr><tr><td>TRK</td><td>Traveloka</td><td>SM</td></tr><tr><td>TRL</td><td>Travelanium</td><td>SM</td></tr><tr><td>TRP</td><td>dnata</td><td>SM</td></tr><tr><td>TSE</td><td>Travel Security</td><td>SM</td></tr><tr><td>TSY</td><td>TravelStaytion</td><td>SM</td></tr><tr><td>TTM</td><td>Taiwan Travel Map</td><td>SM</td></tr><tr><td>TTP</td><td>Cendyn CRS</td><td>SM</td></tr><tr><td>TTV</td><td>Trav Travel</td><td>SM</td></tr><tr><td>TUD</td><td>TUI-DE - FIT Res Download (by Eturistic)</td><td>SM</td></tr><tr><td>TUI</td><td>TUI Future Markets</td><td>SM</td></tr><tr><td>TUK</td><td>Travelodge UK</td><td>SM</td></tr><tr><td>TUU</td><td>TUI-UK - FIT Res Download (by Eturistic)</td><td>SM</td></tr><tr><td>TVC</td><td>Travco</td><td>SM</td></tr><tr><td>TVO</td><td>Trivago</td><td>SM</td></tr><tr><td>TVS</td><td>TravelStay Network Services</td><td>SM</td></tr><tr><td>TVT</td><td>Traveltino</td><td>SM</td></tr><tr><td>VAC</td><td>Vacatia</td><td>SM</td></tr><tr><td>VAT</td><td>Viajes Aramon</td><td>SM</td></tr><tr><td>VCS</td><td>VacayHome Connect</td><td>SM</td></tr><tr><td>VCT</td><td>VeryChic Tonight</td><td>SM</td></tr><tr><td>VCV</td><td>CanariasViaja.com</td><td>SM</td></tr><tr><td>VDE</td><td>verwoehnwochenende.de</td><td>SM</td></tr><tr><td>VEC</td><td>Viajes El Corte Ingles</td><td>SM</td></tr><tr><td>VEG</td><td>Vegas.com</td><td>SM</td></tr><tr><td>VEL</td><td>Velero Incoming</td><td>SM</td></tr><tr><td>VET</td><td>Veturis Travel</td><td>SM</td></tr><tr><td>VIA</td><td>Interrias-TG</td><td>SM</td></tr><tr><td>VIF</td><td>Villa Finder</td><td>SM</td></tr><tr><td>VOL</td><td>Viajes Olympia</td><td>SM</td></tr><tr><td>VOO</td><td>Voordeeluitjes</td><td>SM</td></tr><tr><td>VNG</td><td>Ving - FIT Res Download (by Eturistic)</td><td>SM</td></tr><tr><td>VRB</td><td>Vrbo</td><td>PMS</td></tr><tr><td>VRC</td><td>VeryChic</td><td>SM</td></tr><tr><td>VSB</td><td>VHSHUB - WeChat Booking Engine</td><td>SM</td></tr><tr><td>WAT</td><td>WHL Alba travel</td><td>SM</td></tr><tr><td>WBR</td><td>Webrooms</td><td>SM</td></tr><tr><td>WDC</td><td>Wide Discovery</td><td>SM</td></tr><tr><td>WDS</td><td>Windsurfer CRS</td><td>SM</td></tr><tr><td>WEB</td><td>WebsiteTravel</td><td>SM</td></tr><tr><td>WKD</td><td>Weekendesk</td><td>SM</td></tr><tr><td>WLL</td><td>WellBeds</td><td>SM</td></tr><tr><td>WLV</td><td>Weave Living</td><td>PMS</td></tr><tr><td>WMT</td><td>Worldmeetings.com</td><td>SM</td></tr><tr><td>WOW</td><td>Wowcher</td><td>SM</td></tr><tr><td>WOZ</td><td>Wozozo</td><td>SM</td></tr><tr><td>WTB</td><td>Witbooking</td><td>SM</td></tr><tr><td>WTE</td><td>Withinearth.com</td><td>SM</td></tr><tr><td>WTX</td><td>IOL-X</td><td>SM</td></tr><tr><td>WWW</td><td>Wilderness Window</td><td>SM</td></tr><tr><td>XDO</td><td>SSbooking</td><td>SM</td></tr><tr><td>XML</td><td>XML World</td><td>SM</td></tr><tr><td>XNI</td><td>Xenia International</td><td>SM</td></tr><tr><td>XYT</td><td>XY travel</td><td>SM</td></tr><tr><td>YGT</td><td>Your Golf Travel</td><td>SM</td></tr><tr><td>YHG</td><td>Yonda Holiday Group</td><td>SM</td></tr><tr><td>YNZ</td><td>YHA New Zealand</td><td>SM</td></tr><tr><td>ZAV</td><td>Zavia BE</td><td>SM</td></tr><tr><td>ZOO</td><td>Travelzoo</td><td>SM</td></tr><tr><td>ZOW</td><td>Zoweg</td><td>SM</td></tr></tbody></table>


# Document Type Code (DOC)

Lists codes identifying document types used in transactions.

<table><thead><tr><th width="112">Code</th><th width="656">Type</th></tr></thead><tbody><tr><td>1</td><td>Visa</td></tr><tr><td>2</td><td>Passport</td></tr><tr><td>3</td><td>Military identification</td></tr><tr><td>4</td><td>Drivers license</td></tr><tr><td>5</td><td>National identity document</td></tr><tr><td>6</td><td>Vaccination certificate</td></tr><tr><td>7</td><td>Alien registration number</td></tr><tr><td>8</td><td>Insurance policy number</td></tr><tr><td>9</td><td>Tax exemption number</td></tr><tr><td>10</td><td>Vehicle registration/license number</td></tr><tr><td>11</td><td>Border crossing card</td></tr><tr><td>12</td><td>Refugee travel document</td></tr><tr><td>13</td><td>Pilot's license</td></tr><tr><td>14</td><td>Permanent resident card</td></tr><tr><td>15</td><td>Redress number</td></tr><tr><td>16</td><td>Known traveler number</td></tr><tr><td>17</td><td>Non-standard</td></tr><tr><td>18</td><td>Merchant mariner</td></tr><tr><td>19</td><td>Air Nexus card</td></tr><tr><td>20</td><td>Crew member certificate</td></tr><tr><td>21</td><td>Passport card</td></tr><tr><td>22</td><td>Naturalization certificate</td></tr></tbody></table>


# Error Codes (ERR)

Contains codes for specific errors encountered within the API.

### General Errors

<table><thead><tr><th width="119">Code</th><th width="247">Name</th><th>Description</th></tr></thead><tbody><tr><td>187</td><td>System currently unavailable</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>448</td><td>System error</td><td><code>Invalid Username and/or Password</code></td></tr><tr><td>450</td><td>Unable to process</td><td>EXPLAIN REASON FOR FAILURE</td></tr></tbody></table>

### Update Errors

<table><thead><tr><th width="120">Code</th><th width="246">Name</th><th>Description</th></tr></thead><tbody><tr><td>137</td><td>Adult occupancy mismatch</td><td><code>Invalid included occupancy</code></td></tr><tr><td>249</td><td>Invalid rate code</td><td><code>Rate code not found for this hotel</code></td></tr><tr><td>321</td><td>Required field missing</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>375</td><td>Hotel not active</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>392</td><td>Invalid hotel code</td><td><code>Hotel not found for HotelCode=XXXXXX</code></td></tr><tr><td>397</td><td>Invalid number of adults</td><td><code>Invalid number of adults</code></td></tr><tr><td>402</td><td>Invalid room type</td><td><code>Room type code not found for this hotel</code></td></tr><tr><td>436</td><td>Rate does not exist</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>783</td><td>Room or rate not found</td><td><code>Combination of room code and rate code not found for this hotel</code></td></tr><tr><td>842</td><td>Rate not loaded</td><td>EXPLAIN REASON FOR FAILURE</td></tr></tbody></table>


# Error Warning Types (EWT)

Defines types of warnings that accompany specific errors.

<table><thead><tr><th width="101">Code</th><th width="238">Name</th><th>Reason</th></tr></thead><tbody><tr><td>1</td><td>Unknown</td><td>Indicates an unknown error.</td></tr><tr><td>2</td><td>No implementation</td><td>Indicates that the target business system has no implementation for the intended request.</td></tr><tr><td>3</td><td>Biz rule</td><td>Indicates that the XML message has passed a low-level validation check, but that the business rules for the request message were not met.</td></tr><tr><td>4</td><td>Authentication</td><td>Indicates the message lacks adequate security credentials.</td></tr><tr><td>5</td><td>Authentication timeout</td><td>Indicates that the security credentials in the message have expired.</td></tr><tr><td>6</td><td>Authorization</td><td>Indicates the message lacks adequate security credentials.</td></tr><tr><td>7</td><td>Protocol violation</td><td>Indicates that a request was sent within a message exchange that does not align to the message.</td></tr><tr><td>8</td><td>Transaction model</td><td>Indicates that the target business system does not support the intended transaction-oriented operation.</td></tr><tr><td>9</td><td>Authentical model</td><td>Indicates the type of authentication requested is not recognized.</td></tr><tr><td>10</td><td>Required field missing</td><td>Indicates that an element or attribute that is required in by the schema (or required by agreement between trading partners) is missing from the message.</td></tr><tr><td>11</td><td>Advisory</td><td></td></tr><tr><td>12</td><td>Processing exception</td><td>Indicates that during processing of the request that a not further defined exception occurred.</td></tr><tr><td>13</td><td>Application error</td><td>Indicates that an involved backend application returned an error or warning, which is passed back in the response message.</td></tr></tbody></table>


# Fee Tax Type (FTT)

Includes codes for tax and fee types applied to charges.

<table><thead><tr><th width="113">Code</th><th>Name</th></tr></thead><tbody><tr><td>1</td><td>Bed tax</td></tr><tr><td>2</td><td>City hotel fee</td></tr><tr><td>3</td><td>City tax</td></tr><tr><td>4</td><td>County tax</td></tr><tr><td>5</td><td>Energy tax</td></tr><tr><td>6</td><td>Federal tax</td></tr><tr><td>7</td><td>Food &#x26; beverage tax</td></tr><tr><td>8</td><td>Lodging tax</td></tr><tr><td>9</td><td>Maintenance fee</td></tr><tr><td>10</td><td>Occupancy tax</td></tr><tr><td>11</td><td>Package fee</td></tr><tr><td>12</td><td>Resort fee</td></tr><tr><td>13</td><td>Sales tax</td></tr><tr><td>14</td><td>Service charge</td></tr><tr><td>15</td><td>State tax</td></tr><tr><td>16</td><td>Surcharge</td></tr><tr><td>17</td><td>Total tax</td></tr><tr><td>18</td><td>Tourism tax</td></tr><tr><td>19</td><td>VAT/GST tax</td></tr><tr><td>20</td><td>Surplus Lines Tax</td></tr><tr><td>21</td><td>Insurance Premium Tax</td></tr><tr><td>22</td><td>Application Fee</td></tr><tr><td>23</td><td>Express Handling Fee</td></tr><tr><td>24</td><td>Exempt</td></tr><tr><td>25</td><td>Standard</td></tr><tr><td>26</td><td>Zero-rated</td></tr><tr><td>27</td><td>Miscellaneous</td></tr><tr><td>28</td><td>Room Tax</td></tr><tr><td>29</td><td>Early checkout fee</td></tr><tr><td>30</td><td>Country tax</td></tr><tr><td>31</td><td>Extra person charge</td></tr><tr><td>32</td><td>Banquet service fee</td></tr><tr><td>33</td><td>Room service fee</td></tr><tr><td>34</td><td>Local fee</td></tr><tr><td>35</td><td>Goods and services tax (GST)</td></tr><tr><td>36</td><td>Value Added Tax (VAT)</td></tr><tr><td>37</td><td>Crib fee</td></tr><tr><td>38</td><td>Rollaway fee</td></tr><tr><td>39</td><td>Assessment/license tax</td></tr><tr><td>40</td><td>Pet sanitation fee</td></tr><tr><td>41</td><td>Not known</td></tr><tr><td>42</td><td>Child rollaway charge</td></tr><tr><td>43</td><td>Convention tax</td></tr><tr><td>44</td><td>Extra child charge</td></tr><tr><td>45</td><td>Standard food and beverage gratuity</td></tr><tr><td>46</td><td>National government tax</td></tr><tr><td>47</td><td>Adult rollaway fee</td></tr><tr><td>48</td><td>Beverage with alcohol</td></tr><tr><td>49</td><td>Beverage without alcohol</td></tr><tr><td>50</td><td>Tobacco</td></tr><tr><td>51</td><td>Food</td></tr><tr><td>52</td><td>Total surcharges</td></tr><tr><td>53</td><td>State cost recovery fee</td></tr><tr><td>54</td><td>Miscellaneous fee</td></tr><tr><td>55</td><td>Destination amenity fee</td></tr></tbody></table>


# HTTP Error Handling

Guidelines for interpreting and handling HTTP 4xx and 5xx responses.

HTTP errors provide important information about how a request was processed and whether any action is needed from your system. This page outlines how to interpret the most common 4xx and 5xx responses returned by SiteMinder APIs, along with recommended handling strategies. Understanding these status codes will help you troubleshoot issues efficiently, ensure smoother message flows, and maintain a reliable integration.

### Handling 400 Errors

4xx errors indicate that the request sent by your system cannot be processed due to an issue with the message itself—for example, missing fields, incorrect formatting, invalid credentials, or using an unsupported method. These errors require corrections on the client side before the request can be retried.

| Error Code                   | Error Reason                                                                                                                                                 | Suggested Handling Method                                                                                                                                                        |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 400 – Bad Request            | The request is malformed or does not meet the API specification (e.g., missing required fields, incorrect formatting, invalid characters, invalid XML/JSON). | Validate the structure and content of the request. Ensure that all required fields are present and formatted according to our API specifications. Correct the request and retry. |
| 401 – Unauthorized           | Authentication failed or required credentials are missing (e.g., incorrect username/password, missing or invalid token).                                     | Confirm that the correct credentials and required authentication headers are being used. Update or refresh credentials if necessary.                                             |
| 403 – Forbidden              | The request was understood, but the client is not authorised to access this resource.                                                                        | Confirm that the credentials used have the required permissions. If access should be granted, contact the Partner Integrations team for assistance.                              |
| 404 – Not Found              | The requested endpoint does not exist, is misspelled, or is not enabled for the partner.                                                                     | Verify the endpoint URL, including path and case sensitivity. Check the integration documentation to confirm that the endpoint is supported.                                     |
| 405 – Method Not Allowed     | The HTTP method used is not supported for this endpoint.                                                                                                     | Update the request to use the correct HTTP method as defined in the API specification.                                                                                           |
| 406 – Not Acceptable         | The server cannot return a response in the format specified by the request headers.                                                                          | Confirm that the request’s Accept header matches the expected response type. Adjust the header or format before retrying.                                                        |
| 409 – Conflict               | The request conflicts with the current state of the resource (e.g., duplicate reservation, conflicting operation).                                           | Review the logic triggering the request. Ensure that identifiers are unique and that duplicate messages are not being sent.                                                      |
| 415 – Unsupported Media Type | The Content-Type header or payload format is not supported.                                                                                                  | Update the Content-Type header and ensure the payload format matches the requirements for this endpoint.                                                                         |

### Handling 500 Errors

5xx errors occur when the request is valid, but the server is unable to process it due to an internal problem or an issue with an upstream system. These errors are usually temporary, and in most cases, a retry strategy is recommended. If the error persists after retries, contact our [Application Operations](https://www.siteminder.com/partners-contact/) team for support.

| Error Code                       | Error Reason                                                                                                  | Suggested Handling Method                                                                                                                                                                                                                                                                                                           |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 500 – Internal Server Error      | The server encountered an unexpected condition and could not complete the request.                            | Implement a retry strategy to determine if the issue is temporary. If the error persists, validate the request. If the request appears correct, contact our Application Operations team.                                                                                                                                            |
| 501 – Not Implemented            | The server recognises the request but does not support the functionality required to process it.              | Do not retry. Confirm whether the requested operation is supported by the web service for this endpoint. Adjust the integration to use supported features only.                                                                                                                                                                     |
| 502 – Bad Gateway                | The server, acting as a gateway or proxy, received an invalid or unexpected response from an upstream system. | <p>Implement an <a href="https://en.wikipedia.org/wiki/Exponential_backoff">Exponential Backoff</a> strategy:</p><p><br>5 seconds → 10 seconds → 20 seconds → 40 seconds → then every 1 minute until a minimum timeout of 30 minutes.<br><br>If the issue persists beyond the timeout, contact our Application Operations team.</p> |
| 503 – Service Unavailable        | The server is temporarily unable to process the request due to high load or maintenance.                      | Use the same [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff) strategy recommended for HTTP 502 (minimum 30-minute timeout). If the service does not recover, contact our Application Operations team.                                                                                                      |
| 504 – Gateway Timeout            | The server did not receive a timely response from an upstream system.                                         | Apply the [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff) strategy (minimum 30-minute timeout). If the timeout continues beyond this window, contact our Application Operations team.                                                                                                                      |
| 505 – HTTP Version Not Supported | The server does not support the HTTP protocol version used in the request.                                    | Do not retry. Verify that the client implementation is using the correct HTTP version and configuration.                                                                                                                                                                                                                            |


# Meal Plan Type (MPT)

Lists codes for different meal plans available for bookings.

<table><thead><tr><th width="113">Code</th><th width="649">Type</th></tr></thead><tbody><tr><td>1</td><td>All inclusive</td></tr><tr><td>2</td><td>American</td></tr><tr><td>3</td><td>Bed &#x26; breakfast</td></tr><tr><td>4</td><td>Buffet breakfast</td></tr><tr><td>5</td><td>Caribbean breakfast</td></tr><tr><td>6</td><td>Continental breakfast</td></tr><tr><td>7</td><td>English breakfast</td></tr><tr><td>8</td><td>European plan</td></tr><tr><td>9</td><td>Family plan</td></tr><tr><td>10</td><td>Full board</td></tr><tr><td>11</td><td>Full breakfast</td></tr><tr><td>12</td><td>Half board/modified American plan</td></tr><tr><td>13</td><td>As brochured</td></tr><tr><td>14</td><td>Room only</td></tr><tr><td>15</td><td>Self catering</td></tr><tr><td>16</td><td>Bermuda</td></tr><tr><td>17</td><td>Dinner bed and breakfast plan</td></tr><tr><td>18</td><td>Family American</td></tr><tr><td>19</td><td>Breakfast</td></tr><tr><td>20</td><td>Modified</td></tr><tr><td>21</td><td>Lunch</td></tr><tr><td>22</td><td>Dinner</td></tr><tr><td>23</td><td>Breakfast &#x26; lunch</td></tr><tr><td>24</td><td>Lunch and Dinner</td></tr></tbody></table>


# OpenTravel Codes List

### Additional Detail Type (ADT) <a href="#additional-detail-type-adt" id="additional-detail-type-adt"></a>

<table><thead><tr><th width="167">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Rate description</td></tr><tr><td>2</td><td>Property description</td></tr><tr><td>3</td><td>Property location</td></tr><tr><td>4</td><td>Room information</td></tr><tr><td>5</td><td>Guarantee information</td></tr><tr><td>6</td><td>Deposit information</td></tr><tr><td>7</td><td>Cancellation information</td></tr><tr><td>8</td><td>Check in check out information</td></tr><tr><td>9</td><td>Extra charge information</td></tr><tr><td>10</td><td>Tax information</td></tr><tr><td>11</td><td>Service charge information</td></tr><tr><td>12</td><td>Package information</td></tr><tr><td>13</td><td>Commission information</td></tr><tr><td>14</td><td>Miscellaneous information</td></tr><tr><td>15</td><td>Promotional information</td></tr><tr><td>16</td><td>Inclusion information</td></tr><tr><td>17</td><td>Amenity information</td></tr><tr><td>18</td><td>Late arrival information</td></tr><tr><td>19</td><td>Late departure information</td></tr><tr><td>20</td><td>Advanced booking information</td></tr><tr><td>21</td><td>Extra person information</td></tr><tr><td>22</td><td>Areas served</td></tr><tr><td>23</td><td>Onsite facilities information</td></tr><tr><td>24</td><td>Offsite facilities information</td></tr><tr><td>25</td><td>Onsite services information</td></tr><tr><td>26</td><td>Offsite services information</td></tr><tr><td>27</td><td>Extended stay information</td></tr><tr><td>28</td><td>Corporate booking information</td></tr><tr><td>29</td><td>Booking guidelines</td></tr><tr><td>30</td><td>Government booking policy</td></tr><tr><td>31</td><td>Group booking information</td></tr><tr><td>32</td><td>Rate disclaimer information</td></tr><tr><td>33</td><td>Visa/travel requirement information</td></tr><tr><td>34</td><td>Security information</td></tr><tr><td>35</td><td>Onsite recreational activities information</td></tr><tr><td>36</td><td>Offsite recreational activities information</td></tr><tr><td>37</td><td>General meeting planning information</td></tr><tr><td>38</td><td>Group meeting planning information</td></tr><tr><td>39</td><td>Contract/negotiated booking information</td></tr><tr><td>40</td><td>Travel industry booking information</td></tr><tr><td>41</td><td>Meeting room description</td></tr><tr><td>42</td><td>Pet policy description</td></tr><tr><td>43</td><td>Meal plan description</td></tr><tr><td>44</td><td>Family plan description</td></tr><tr><td>45</td><td>Children information</td></tr><tr><td>46</td><td>Early checkout description</td></tr><tr><td>47</td><td>Special offers description</td></tr><tr><td>48</td><td>Catering description</td></tr><tr><td>49</td><td>Room decor description</td></tr><tr><td>50</td><td>Oversold policy description</td></tr><tr><td>51</td><td>Last room availability description</td></tr><tr><td>52</td><td>Room type upgrade description</td></tr><tr><td>53</td><td>Driving directions</td></tr><tr><td>54</td><td>Driving directions from the north</td></tr><tr><td>55</td><td>Driving directions from the south</td></tr><tr><td>56</td><td>Driving directions from the east</td></tr><tr><td>57</td><td>Driving directions from the west</td></tr><tr><td>58</td><td>Surcharge information</td></tr><tr><td>59</td><td>Minimum stay information</td></tr><tr><td>60</td><td>Maximum stay information</td></tr><tr><td>61</td><td>Check-in policy</td></tr><tr><td>62</td><td>Check-out policy</td></tr><tr><td>63</td><td>Express check-in policy</td></tr><tr><td>64</td><td>Express check-out policy</td></tr><tr><td>65</td><td>Facility restrictions</td></tr><tr><td>66</td><td>Customs information for material</td></tr><tr><td>67</td><td>Seasons</td></tr><tr><td>68</td><td>Food and beverage minimums for groups</td></tr><tr><td>69</td><td>Deposit policy for master account</td></tr><tr><td>70</td><td>Deposit policy for reservations</td></tr><tr><td>71</td><td>Restaurant services</td></tr><tr><td>72</td><td>Special events</td></tr><tr><td>73</td><td>Cuisine description</td></tr></tbody></table>

### Age Qualifying Code (AQC)

<table><thead><tr><th width="137">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Over 21</td></tr><tr><td>2</td><td>Over 65</td></tr><tr><td>3</td><td>Under 2</td></tr><tr><td>4</td><td>Under 12</td></tr><tr><td>5</td><td>Under 17</td></tr><tr><td>6</td><td>Under 21</td></tr><tr><td>7</td><td>Infant</td></tr><tr><td>8</td><td>Child</td></tr><tr><td>9</td><td>Teenager</td></tr><tr><td>10</td><td>Adult</td></tr><tr><td>11</td><td>Senior</td></tr><tr><td>12</td><td>Additional occupant with adult</td></tr><tr><td>13</td><td>Additional occupant without adult</td></tr><tr><td>14</td><td>Free child</td></tr><tr><td>15</td><td>Free adult</td></tr><tr><td>16</td><td>Young driver</td></tr><tr><td>17</td><td>Younger driver</td></tr><tr><td>18</td><td>Under 10</td></tr><tr><td>19</td><td>Junior</td></tr></tbody></table>

### Booking Channel Type (BCT)

<table><thead><tr><th width="100">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Global distribution system (GDS)</td></tr><tr><td>2</td><td>Alternative distribution system (ADS)</td></tr><tr><td>3</td><td>Sales and catering system (SCS)</td></tr><tr><td>4</td><td>Property management system (PMS)</td></tr><tr><td>5</td><td>Central reservation system (CRS)</td></tr><tr><td>6</td><td>Tour operator system (TOS)</td></tr><tr><td>7</td><td>Internet</td></tr><tr><td>8</td><td>Kiosk</td></tr><tr><td>9</td><td>Agent</td></tr></tbody></table>

### Communication Location Type (CLT)

<table><thead><tr><th width="145">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Home</td></tr><tr><td>2</td><td>Business</td></tr><tr><td>3</td><td>Other</td></tr><tr><td>4</td><td>Destination</td></tr></tbody></table>

### Email Address Type (EAT)

<table><thead><tr><th width="100">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Personal</td></tr><tr><td>2</td><td>Business</td></tr><tr><td>3</td><td>Listserve</td></tr><tr><td>4</td><td>Internet</td></tr><tr><td>5</td><td>Property</td></tr><tr><td>6</td><td>Sales office</td></tr><tr><td>7</td><td>Reservation office</td></tr><tr><td>8</td><td>Managing company</td></tr></tbody></table>

### Fee Tax Type (FTT)

<table><thead><tr><th width="147">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Bed tax</td></tr><tr><td>2</td><td>City hotel fee</td></tr><tr><td>3</td><td>City tax</td></tr><tr><td>4</td><td>County tax</td></tr><tr><td>5</td><td>Energy tax</td></tr><tr><td>6</td><td>Federal tax</td></tr><tr><td>7</td><td>Food &#x26; beverage tax</td></tr><tr><td>8</td><td>Lodging tax</td></tr><tr><td>9</td><td>Maintenance fee</td></tr><tr><td>10</td><td>Occupancy tax</td></tr><tr><td>11</td><td>Package fee</td></tr><tr><td>12</td><td>Resort fee</td></tr><tr><td>13</td><td>Sales tax</td></tr><tr><td>14</td><td>Service charge</td></tr><tr><td>15</td><td>State tax</td></tr><tr><td>16</td><td>Surcharge</td></tr><tr><td>17</td><td>Total tax</td></tr><tr><td>18</td><td>Tourism tax</td></tr><tr><td>19</td><td>VAT/GST tax</td></tr><tr><td>20</td><td>Surplus Lines Tax</td></tr><tr><td>21</td><td>Insurance Premium Tax</td></tr><tr><td>22</td><td>Application Fee</td></tr><tr><td>23</td><td>Express Handling Fee</td></tr><tr><td>24</td><td>Exempt</td></tr><tr><td>25</td><td>Standard</td></tr><tr><td>26</td><td>Zero-rated</td></tr><tr><td>27</td><td>Miscellaneous</td></tr><tr><td>28</td><td>Room Tax</td></tr><tr><td>29</td><td>Early checkout fee</td></tr><tr><td>30</td><td>Country tax</td></tr><tr><td>31</td><td>Extra person charge</td></tr><tr><td>32</td><td>Banquet service fee</td></tr><tr><td>33</td><td>Room service fee</td></tr><tr><td>34</td><td>Local fee</td></tr><tr><td>35</td><td>Goods and services tax (GST)</td></tr><tr><td>36</td><td>Value Added Tax (VAT)</td></tr><tr><td>37</td><td>Crib fee</td></tr><tr><td>38</td><td>Rollaway fee</td></tr><tr><td>39</td><td>Assessment/license tax</td></tr><tr><td>40</td><td>Pet sanitation fee</td></tr><tr><td>41</td><td>Not known</td></tr><tr><td>42</td><td>Child rollaway charge</td></tr><tr><td>43</td><td>Convention tax</td></tr><tr><td>44</td><td>Extra child charge</td></tr><tr><td>45</td><td>Standard food and beverage gratuity</td></tr><tr><td>46</td><td>National government tax</td></tr><tr><td>47</td><td>Adult rollaway fee</td></tr><tr><td>48</td><td>Beverage with alcohol</td></tr><tr><td>49</td><td>Beverage without alcohol</td></tr><tr><td>50</td><td>Tobacco</td></tr><tr><td>51</td><td>Food</td></tr><tr><td>52</td><td>Total surcharges</td></tr><tr><td>53</td><td>State cost recovery fee</td></tr><tr><td>54</td><td>Miscellaneous fee</td></tr><tr><td>55</td><td>Destination amenity fee</td></tr></tbody></table>

### Meal Plan Type (MPT)

<table><thead><tr><th width="146">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>All inclusive</td></tr><tr><td>2</td><td>American/full board</td></tr><tr><td>3</td><td>Bed &#x26; breakfast</td></tr><tr><td>4</td><td>Buffet breakfast</td></tr><tr><td>5</td><td>Caribbean breakfast</td></tr><tr><td>6</td><td>Continental breakfast</td></tr><tr><td>7</td><td>English breakfast</td></tr><tr><td>8</td><td>European plan</td></tr><tr><td>9</td><td>Family plan</td></tr><tr><td>10</td><td>Full board</td></tr><tr><td>11</td><td>Full breakfast</td></tr><tr><td>12</td><td>Half board/modified American plan</td></tr><tr><td>13</td><td>As brochured</td></tr><tr><td>14</td><td>Room only/European plan</td></tr><tr><td>15</td><td>Self catering</td></tr><tr><td>16</td><td>Bermuda</td></tr><tr><td>17</td><td>Dinner bed and breakfast plan</td></tr><tr><td>18</td><td>Family American</td></tr><tr><td>19</td><td>Breakfast</td></tr><tr><td>20</td><td>Modified</td></tr><tr><td>21</td><td>Lunch</td></tr><tr><td>22</td><td>Dinner</td></tr><tr><td>23</td><td>Breakfast &#x26; lunch</td></tr></tbody></table>

### Name Type (NAM)

<table><thead><tr><th width="142">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Former</td></tr><tr><td>2</td><td>Nickname</td></tr><tr><td>3</td><td>Alternate</td></tr><tr><td>4</td><td>Maiden</td></tr></tbody></table>

### Phone Location Type (PLT)

<table><thead><tr><th width="148">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Brand reservations office</td></tr><tr><td>2</td><td>Central reservations office</td></tr><tr><td>3</td><td>Property reservation Office</td></tr><tr><td>4</td><td>Property direct</td></tr><tr><td>5</td><td>Sales office</td></tr><tr><td>6</td><td>Home</td></tr><tr><td>7</td><td>Office</td></tr><tr><td>8</td><td>Other</td></tr><tr><td>9</td><td>Managing company</td></tr><tr><td>10</td><td>Mobile</td></tr></tbody></table>

### Phone Technology Type (PTT)

<table><thead><tr><th width="140">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Voice</td></tr><tr><td>2</td><td>Data</td></tr><tr><td>3</td><td>Fax</td></tr><tr><td>4</td><td>Pager</td></tr><tr><td>5</td><td>Mobile</td></tr><tr><td>6</td><td>TTY</td></tr><tr><td>7</td><td>Telex</td></tr><tr><td>8</td><td>Voice over IP</td></tr></tbody></table>

### Profile Type (PRT)

<table><thead><tr><th width="141">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Customer</td></tr><tr><td>2</td><td>GDS</td></tr><tr><td>3</td><td>Corporation</td></tr><tr><td>4</td><td>Travel agent</td></tr><tr><td>5</td><td>Wholesaler</td></tr><tr><td>6</td><td>Group</td></tr><tr><td>7</td><td>Tour operator</td></tr><tr><td>8</td><td>CRO</td></tr><tr><td>9</td><td>Representation company</td></tr><tr><td>10</td><td>Internet broker</td></tr><tr><td>11</td><td>Airline</td></tr><tr><td>12</td><td>Hotel</td></tr><tr><td>13</td><td>Car rental</td></tr><tr><td>14</td><td>Cruise line</td></tr><tr><td>15</td><td>Employee</td></tr><tr><td>16</td><td>Event host</td></tr><tr><td>17</td><td>Supplier partner</td></tr><tr><td>18</td><td>Billing contact</td></tr><tr><td>19</td><td>Authorized signer</td></tr><tr><td>20</td><td>General service contractor</td></tr><tr><td>21</td><td>Arranger</td></tr><tr><td>22</td><td>Association</td></tr><tr><td>23</td><td>Travel agency</td></tr></tbody></table>

### Segment Category Code (SEG)

<table><thead><tr><th width="138">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>All suite</td></tr><tr><td>2</td><td>Budget</td></tr><tr><td>3</td><td>Corporate business transient</td></tr><tr><td>4</td><td>Deluxe</td></tr><tr><td>5</td><td>Economy</td></tr><tr><td>6</td><td>Extended stay</td></tr><tr><td>7</td><td>First class</td></tr><tr><td>8</td><td>Luxury</td></tr><tr><td>9</td><td>Meeting/Convention</td></tr><tr><td>10</td><td>Moderate</td></tr><tr><td>11</td><td>Residential apartment</td></tr><tr><td>12</td><td>Resort</td></tr><tr><td>13</td><td>Tourist</td></tr><tr><td>14</td><td>Upscale</td></tr><tr><td>15</td><td>Efficiency</td></tr><tr><td>16</td><td>Standard</td></tr><tr><td>17</td><td>Midscale</td></tr><tr><td>18</td><td>Moderate 2</td></tr><tr><td>19</td><td>Quality</td></tr><tr><td>20</td><td>Quality 2</td></tr><tr><td>21</td><td>Unknown</td></tr><tr><td>22</td><td>Midscale without F&#x26;B</td></tr><tr><td>23</td><td>Upper upscale</td></tr></tbody></table>

### Unique ID Type (UIT)

<table><thead><tr><th width="145">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Customer</td></tr><tr><td>2</td><td>CRO (Customer Reservations Office)</td></tr><tr><td>3</td><td>Corporation representative</td></tr><tr><td>4</td><td>Company</td></tr><tr><td>5</td><td>Travel agency</td></tr><tr><td>6</td><td>Airline</td></tr><tr><td>7</td><td>Wholesaler</td></tr><tr><td>8</td><td>Car rental</td></tr><tr><td>9</td><td>Group</td></tr><tr><td>10</td><td>Hotel</td></tr><tr><td>11</td><td>Tour operator</td></tr><tr><td>12</td><td>Cruise line</td></tr><tr><td>13</td><td>Internet broker</td></tr><tr><td>14</td><td>Reservation</td></tr><tr><td>15</td><td>Cancellation</td></tr><tr><td>16</td><td>Reference</td></tr><tr><td>17</td><td>Meeting planning agency</td></tr><tr><td>18</td><td>Other</td></tr><tr><td>19</td><td>Insurance agency</td></tr><tr><td>20</td><td>Insurance agent</td></tr><tr><td>21</td><td>Profile</td></tr><tr><td>22</td><td>ERSP (Electronic reservation service provider)</td></tr><tr><td>23</td><td>Provisional reservation</td></tr><tr><td>24</td><td>Travel Agent PNR</td></tr><tr><td>25</td><td>Associated reservation</td></tr><tr><td>26</td><td>Associated itinerary reservation</td></tr><tr><td>27</td><td>Associated shared reservation</td></tr><tr><td>28</td><td>Alliance</td></tr><tr><td>29</td><td>Booking agent</td></tr><tr><td>30</td><td>Ticket</td></tr><tr><td>31</td><td>Divided reservation</td></tr><tr><td>32</td><td>Merchant</td></tr><tr><td>33</td><td>Acquirer</td></tr><tr><td>34</td><td>Master reference</td></tr><tr><td>35</td><td>Purged master reference</td></tr><tr><td>36</td><td>Parent reference</td></tr><tr><td>37</td><td>Child reference</td></tr><tr><td>38</td><td>Linked reference</td></tr><tr><td>39</td><td>Contract</td></tr><tr><td>40</td><td>Confirmation number</td></tr><tr><td>41</td><td>Fare quote</td></tr><tr><td>42</td><td>Reissue/refund quote</td></tr><tr><td>43</td><td>Ground transportation supplier</td></tr><tr><td>44</td><td>EMD</td></tr></tbody></table>


# Payment Card Provider Codes

Identifies codes for various payment card providers.

<table data-full-width="false"><thead><tr><th width="110">Code</th><th width="644">Type</th></tr></thead><tbody><tr><td>AX</td><td>American Express</td></tr><tr><td>BC</td><td>Bank Card</td></tr><tr><td>BL</td><td>Carte Bleu</td></tr><tr><td>CB</td><td>Carte Blanche</td></tr><tr><td>DN</td><td>Diners Club</td></tr><tr><td>DS</td><td>Discover Card</td></tr><tr><td>EC</td><td>Eurocard</td></tr><tr><td>JC</td><td>Japanese Credit Bureau Credit Card</td></tr><tr><td>LC</td><td>Local Card</td></tr><tr><td>MA</td><td>Maestro</td></tr><tr><td>MC</td><td>Master Card</td></tr><tr><td>SO</td><td>Solo</td></tr><tr><td>CU</td><td>Union Pay</td></tr><tr><td>TP</td><td>Universal Air Travel Card</td></tr><tr><td>VE</td><td>Visa Electron</td></tr><tr><td>VI</td><td>VIsa</td></tr></tbody></table>


# Service and Extra Charge

Contains ServiceInventoryCode for additional services or charges.

For channels/OTA's under **SiteConnect API**: Use this list as a guide to code your extras/services. You can use additional codes not on the list such as PARKING or your own service identifier codes generated in your system.

For PMSs under **pmsXchange API**: Channels/OTA's will use this list as a guide to code the extras/services or can use their own codes as well. Please request the property or the channel for the full list of extras/services and the codes.

<table><thead><tr><th width="185">Type</th><th width="480">Description</th></tr></thead><tbody><tr><td>EXTRA_PERSON</td><td>Charges related to extra people</td></tr><tr><td>EXTRA_BED</td><td>Extra bed charges</td></tr><tr><td>SURCHARGE</td><td>Surcharges, for example credit card surcharge</td></tr><tr><td>MEAL</td><td>Charges related to the meal</td></tr><tr><td>SERVICE</td><td>General hotel nominated service charges</td></tr><tr><td>TOUR</td><td>Charges for a tour</td></tr><tr><td>EVENT</td><td>Charges for an event</td></tr><tr><td>EXTRA</td><td>Un-categorised extra added to the reservation</td></tr><tr><td>OTHER</td><td>Any additional charge that does not fall under the above categories, where OTHER is specified more information will be provided in the description</td></tr></tbody></table>


# Strong Customer Authentication Codes

Lists codes for authentication types required for secure transactions.

### Electronic Commerce Indicator

<table><thead><tr><th width="130">Value</th><th>Definition</th></tr></thead><tbody><tr><td>02 or 05</td><td>Fully Authenticated Transaction</td></tr><tr><td>01 or 06</td><td>Attempted Authentication Transaction</td></tr><tr><td>00 or 07</td><td>Non 3-D Secure Transaction</td></tr><tr><td>02, 01, 00</td><td>Mastercard</td></tr><tr><td>05, 06, 07</td><td>Visa</td></tr><tr><td>05, 06, 07</td><td>Amex</td></tr><tr><td>05, 06, 07</td><td>JCB</td></tr><tr><td>05, 06, 07</td><td>Diners</td></tr></tbody></table>

### Transactions Status Result Identifier

<table><thead><tr><th width="133">Value</th><th>Definition</th></tr></thead><tbody><tr><td>Y</td><td>Successful Authentication</td></tr><tr><td>N</td><td>Failed Authentication</td></tr><tr><td>U</td><td>Unable to Complete Authentication</td></tr><tr><td>A</td><td>Successful Attempts Transaction</td></tr><tr><td>B</td><td>You can proceed to authorisation using the information received</td></tr><tr><td>R</td><td>Authentication Rejected (Merchant must not submit for authorisation)</td></tr></tbody></table>

### Transaction Signature Status

<table><thead><tr><th width="134">Value</th><th>Definition</th></tr></thead><tbody><tr><td>Y</td><td>Indicates that the signature of the PARes has been validated successfully and the message contents can be trusted.</td></tr><tr><td>N</td><td>Indicates that the PARes could not be validated. This result could be for a variety of reasons; tampering, certificate expiration, etc., and the result should not be trusted.</td></tr><tr><td>null</td><td>If not sent then null</td></tr></tbody></table>

### Status of Authentication

<table><thead><tr><th width="136">Value</th><th>Definition</th></tr></thead><tbody><tr><td>Y</td><td>Yes, Bank is participating in 3-D Secure protocol and will return the ACSUrl</td></tr><tr><td>N</td><td>No, Bank is not participating in 3-D Secure protocol</td></tr><tr><td>U</td><td>Unavailable, The DS or ACS is not available for authentication at the time of the request</td></tr><tr><td>B</td><td>Bypass, Merchant authentication rule is triggered to bypass authentication in this use case</td></tr></tbody></table>


# Test Credit Cards

Mock data for simulating payment transactions during reservation testing.

**Card Holder Name:** Any value\
**CVV:** Any value\
**Expiration date:** Any date in the future\
**Amount:** Any value\
**Card Number:**

| Type                               | Card Number                                                                                                                                                                                         |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| American Express                   | <p><code>3782 8224 6310 0005</code></p><p><code>3782 0000 1111 2222</code></p>                                                                                                                      |
| Bank Card                          | <p><code>5555 5555 5555 4444</code></p><p><code>5555 1111 2222 6666</code></p>                                                                                                                      |
| Carte Bleu                         | <p><code>5555 6666 8888 9999</code></p><p><code>5555 5555 5555 4444</code></p>                                                                                                                      |
| Carte Blanche                      | <p><code>3056 9309 0259 04</code></p><p><code>3056 1111 2222 33</code></p>                                                                                                                          |
| Diners Club                        | <p><code>3056 9300 0902 0004</code></p><p><code>3056 9311 2111 3222</code></p><p><code>3852 0000 0232 37</code></p>                                                                                 |
| Discover Card                      | <p><code>6011 1111 1111 1117</code></p><p><code>6011 0009 9013 9424</code></p>                                                                                                                      |
| Eurocard                           | <p><code>5100 0000 1111 3333</code></p><p><code>5473 0000 0000 0007</code></p>                                                                                                                      |
| Japanese Credit Bureau Credit Card | <p><code>3566 0020 2036 0505</code></p><p><code>3530 1113 3330 0000</code></p>                                                                                                                      |
| Local Card                         | <p><code>1234 4567 7890 4222</code></p><p><code>9890 6555 7777 8888</code></p>                                                                                                                      |
| Maestro                            | <p><code>6759 6498 2643 8453</code><br><code>6799 9901 0000 0000</code></p>                                                                                                                         |
| Master Card                        | <p><code>5555 5555 5555 4444</code></p><p><code>5200 0078 4000 0022</code></p><p><code>5506 9274 2731 7625</code></p><p><code>5506 9208 0924 3667</code></p>                                        |
| Solo                               | <p><code>6334 0000 1111 2222</code></p><p><code>6767 0000 1111 4444</code></p>                                                                                                                      |
| Union Pay                          | <p><code>6200 0000 0000 0005</code></p><p><code>6200 5555 6666 7777</code></p>                                                                                                                      |
| Universal Air Travel Card          | <p><code>1000 70000 000112</code></p><p><code>1000 70000 000155</code></p><p><code>1000 88888 000155</code></p>                                                                                     |
| Visa Electron                      | <p><code>4917 3000 0000 0008</code></p><p><code>4917 1111 2222 3333</code></p>                                                                                                                      |
| VIsa                               | <p><code>4242 4242 4242 4242</code></p><p><code>4000 0019 6000 0008</code></p><p><code>4035 5010 0000 0008</code></p><p><code>4000 0200 0000 0000</code></p><p><code>4111 1111 1111 1111</code></p> |


# Changelog

Stay up to date with the latest changes, enhancements, and fixes for the pmsXchange API.

### 2026

{% updates format="full" %}
{% update date="2026-08-04" tags="beta,added,rates,restrictions,configuration" %}

## API Versioning & New Fields&#x20;

Added versioning support to *Room and Rates: PMS -> SM*, *Restrictions: SM -> PMS* and *Rates: SM -> PMS* endpoints.\
Additional mandatory fields added to *Room and Rates: PMS -> SM* payloa&#x64;*.*
{% endupdate %}

{% update date="2026-02-22" tags="beta,added,rates" %}

## <sup>Rates: SM -> PMS</sup>

Receive real-time rate updates from SiteMinder to keep your PMS synchronized. More details in [Rates: SM -> PMS](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/rates/sm-to-pms).
{% endupdate %}

{% update date="2026-02-22" tags="beta,added,restrictions" %}

## <sup>Restrictions: SM -> PMS</sup>

Receive real-time restriction updates from SiteMinder to keep your PMS synchronized. More details in [Rates: SM -> PMS](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/rates/sm-to-pms).
{% endupdate %}

{% update date="2026-02-22" tags="beta,added,configuration" %}

## <sup>Room and Rates: PMS -> SM</sup>

Share room type and rate plan configurations from your PMS with the SiteMinder Platform. More details in [Rates: SM -> PMS](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/rates/sm-to-pms).
{% endupdate %}

{% update date="2025-01-01" tags="added,reservations" %}

## <sup>Guest Communication Flags</sup>

Added support for 'ShareAllOptOutInd' and 'ShareAllMarketInd' Reservation Customer flags for PMSX. More details in [Reservation Customer](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/reservations/push-sm-to-pms#customer-company-travelagent).
{% endupdate %}
{% endupdates %}

### 2025

{% updates format="full" %}
{% update date="2025-11-01" tags="beta,added,reservations" %}

## <sup>Reservation Upload</sup>

Added additional reservation type scenarios to help facilitate improved reservation handling in the greater SiteMinder ecosystem. For more details see [POS/Source](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations-upload#pos-source) and [HotelReservationIDs](https://developer.siteminder.com/siteminder-apis/pms-rms/introduction/pmsxchange/api-reference/reservations-upload#hotelreservationids) sections.

Sync PMS reservations back to SiteMinder Platform. More details in [Reservation Upload](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/reservations/upload-pms-to-sm).
{% endupdate %}
{% endupdates %}

### 2024

{% updates format="full" %}
{% update date="2024-12-03" tags="added,reservations" %}

## <sup>Reservation Import</sup>

Bulk import active reservations from SiteMinder Platform to your PMS during initial integration setup. More details in [Reservation Import](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/reservations/import).
{% endupdate %}

{% update date="2024-08-14" tags="added,configuration" %}

## <sup>Rooms and Rates: SM -> PMS</sup>

This API enables a Property Management System (PMS) to request a list of Room Rates and mapping codes from SiteMinder for a specific hotel. Supports`JSON`. More details in [Rooms and Rates](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/rooms-and-rates/sm-to-pms).
{% endupdate %}

{% update date="2024-05-08" tags="added,payment" %}

## <sup>Non-Card Based Transactions</sup>

Updates the [Payment Transaction Record](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/payment-transaction-record) to support new payment methods that are non-card based (Ex: AliPay). `PaymentType="46"` for online payment.
{% endupdate %}

{% update date="2024-01-30" tags="added,rates" %}

## <sup>Occupancy Based Pricing</sup>

OBP is a pricing model where rates vary based on the number of occupants in the room. Under this model, the rate changes depending on the number of guests staying in the room. The Rate updates for OBP include rates for various occupancy levels, providing detailed pricing based on the number of guests. More details in [Rates](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/rates/pms-to-sm).

{% code overflow="wrap" expandable="true" %}

```xml
<RateAmountMessages HotelCode="HOTEL">
	<RateAmountMessage>
		<StatusApplicationControl InvTypeCode="SUP" RatePlanCode="BAR"/>
		<Rates>
			<Rate CurrencyCode="AUD" Start="2025-03-01" End="2025-03-14">
				<BaseByGuestAmts>
					<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="1" AmountAfterTax="100.00"/>
					<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="2" AmountAfterTax="200.00"/>
					<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="3" AmountAfterTax="250.00"/>
					<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="4" AmountAfterTax="300.00"/>
					<BaseByGuestAmt AgeQualifyingCode="10" NumberOfGuests="5" AmountAfterTax="350.00"/>
				</BaseByGuestAmts>
				<AdditionalGuestAmounts>
					<AdditionalGuestAmount AgeQualifyingCode="10" Amount="50"/>
					<!-- Extra Adult Rate -->
					<AdditionalGuestAmount AgeQualifyingCode="8" Amount="10"/>
					<!-- Extra Child Rate -->
				</AdditionalGuestAmounts>
			</Rate>
		</Rates>
	</RateAmountMessage>
	<!-- Additional RateAmountMessage elements -->
</RateAmountMessages>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2022

{% updates format="full" %}
{% update date="2022-12-01" tags="added,payment" %}

## <sup>Payment Transaction Record</sup>

A one-way API that allows a PMS to retrieve reservation payment transaction data. These payment transactions are payments taken against a reservation via SiteMinder's Pay product. More details in [Payment Transaction Record](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/pms-rms-pmsxchange/api-reference/payment-transaction-record).
{% endupdate %}

{% update date="2022-03-15" tags="added,reservations" %}

## <sup>Local Card (LC)</sup>

SiteMinder has added support for the Payment Card Type - Local Card (LC). This card is primarily used in the South Korean market and reservations from HotelsCombined. `CardCode="LC"`.
{% endupdate %}
{% endupdates %}

### 2021

{% updates format="full" %}
{% update date="2021-10-20" tags="added,reservations" %}

## <sup>Profile / Customer / Document</sup>

The OTA\_ResRetrieveRS supports Customer / Document attributes to provide detailed document information for the guest (e.g. driver's license, passport, visa).

{% code overflow="wrap" expandable="true" %}

```xml
<Customer>
	<Document DocID="P123456" DocType="18" Gender="unknown" BirthDate="1920-02-29" BirthCountry="US" BirthPlace="Sydney" DocHolderNationality="AU" DocIssueAuthority="ImmigionNNNNNNNN" DocIssueCountry="AU" DocIssueLocation="Sydney" DocIssueStateProvince="QLD" EffectiveDate="2020-01-01" ExpireDate="2025-01-01">
		<DocumentHolderName>James Herbert</DocumentHolderName>
	</Document>
	...
</Customer>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2019

{% updates format="full" %}
{% update date="2019-09-16" tags="added,reservations" %}

## <sup>Strong Customer Authentication (SCA)</sup>

3DS data can now be delivered in reservations alongside payment card data. SCA functionality is opt-in.

{% code overflow="wrap" expandable="true" %}

```xml
<Guarantee>
    <GuaranteesAccepted>
        <GuaranteeAccepted>
            <PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" ExpireDate="1234">
                <CardHolderName>John Smith</CardHolderName>
                <ThreeDomainSecurity>
                    <Results ThreeDSVersion="1.0.2" XID="z9UKb06xLziZMOXBEmWSVA1kwG0=" CAVV="MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=" ECI="05" />
                </ThreeDomainSecurity>
            </PaymentCard>
        </GuaranteeAccepted>
    </GuaranteesAccepted>
</Guarantee>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2015

{% updates format="full" %}
{% update date="2015-10-16" tags="added,restrictions" %}

## <sup>Setting Maximum Stay</sup>

Setting maximum stay is achieved by including the LengthsOfStay element.

{% code overflow="wrap" expandable="true" %}

```xml
<AvailStatusMessages HotelCode="HOTEL">
	<AvailStatusMessage>
		<StatusApplicationControl Start="2025-03-01" End="2025-03-14" InvTypeCode="SUP" RatePlanCode="GLD"/>
		<LengthsOfStay>
			<LengthOfStay MinMaxMessageType="SetMinLOS" Time="2"/>
			<!-- Min Length of Stay -->
			<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="5"/>
			<!-- Max Length of Stay -->
		</LengthsOfStay>
		<RestrictionStatus Status="Close"/>
		<!-- Stop Sell -->
	</AvailStatusMessage>
</AvailStatusMessages>
```

{% endcode %}
{% endupdate %}

{% update date="2015-08-26" tags="added,reservations" %}

## <sup>ResGlobalInfo / BasicPropertyInfo / HotelCode</sup>

Booking.com Cancellations are being sent without a RoomStay present. As a result, RoomStay / BasicPropertyInfo / @HotelCode is not present on Booking.com reservation cancellation messages. To remedy this, the @HotelCode is being added to ResGlobal / BasicPropertyInfo / @HotelCode, in addition to the current location RoomStay / BasicPropertyInfo / BasicPropertyInfo.

NB: If you currently use RoomStay / BasicPropertyInfo / @HotelCode and require the use of ResGlobal / BasicPropertyInfo / @HotelCode, you'll need to get in contact with <partner.integrations@siteminder.com> to get the change activated.
{% endupdate %}

{% update date="2015-06-17" tags="added,reservations" %}

## <sup>ResGuest / PrimaryIndicator</sup>

When true indicates this is the primary guest.

{% code overflow="wrap" expandable="true" %}

```xml
<ResGuest ResGuestRPH="1" ArrivalTime="10:30:00" Age="8" PrimaryIndicator="true">
```

{% endcode %}
{% endupdate %}

{% update date="2015-03-02" tags="added,reservations" %}

## <sup>Guarantee / MaskedCardNumber</sup>

May be used to send a concealed or partial credit card number (e.g. "xxxxxxxxxxxx4444" or "4444").

{% code overflow="wrap" expandable="true" %}

```xml
<GuaranteeAccepted>
	<PaymentCard CardCode="VI" CardType="1" MaskedCardNumber="4444" ExpireDate="1114">
		<CardHolderName>Jhon Ford</CardHolderName>
	</PaymentCard>
</GuaranteeAccepted>
```

{% endcode %}
{% endupdate %}

{% update date="2015-01-28" tags="added,reservations" %}

## <sup>Support Percent for DepositPayments</sup>

This is the percentage of the Total charge for the deposit. If the the Total.amountAfterTax is provided, it will be a percentage of this value. If only the amountBeforeTax is provided it will be the percentage of this value. At least @Amount or @Percent will be populated.

{% code overflow="wrap" expandable="true" %}

```xml
<DepositPayments>
    <GuaranteePayment>
        <AmountPercent Amount="30.00" CurrencyCode="USD" Percent="20.00"/>
        <Description>
            <Text>20% Deposit</Text>
        </Description>
    </GuaranteePayment>
</DepositPayments>		
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2014

{% updates format="full" %}
{% update date="2014-10-22" tags="added,rates" %}

## <sup>Setting Rates</sup>

Rates should be sent through in the BaseByGuestAmt element. Either @AmountAfterTax or @AmountBeforeTax must be included and must contain the rate as a positive decimal value.

{% code title="Update with AmountAfterTax" overflow="wrap" expandable="true" %}

```xml
<RateAmountMessages HotelCode="HOTEL">
		<RateAmountMessage>
			<StatusApplicationControl InvTypeCode="SUP" RatePlanCode="BAR"/>
			<Rates>
				<Rate CurrencyCode="AUD" Start="2025-03-01" End="2025-03-14">
					<BaseByGuestAmts>
						<BaseByGuestAmt AmountAfterTax="123.00"/> <!-- Base Rate -->
					</BaseByGuestAmts>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
```

{% endcode %}

{% code title="Update with AmountBeforeTax" overflow="wrap" expandable="true" %}

```xml
<RateAmountMessages HotelCode="HOTEL">
		<RateAmountMessage>
			<StatusApplicationControl InvTypeCode="SUP" RatePlanCode="BAR"/>
			<Rates>
				<Rate CurrencyCode="AUD" Start="2025-03-01" End="2025-03-14">
					<BaseByGuestAmts>
						<BaseByGuestAmt AmountBeforeTax="123.00"/> <!-- Base Rate -->
					</BaseByGuestAmts>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
```

{% endcode %}
{% endupdate %}

{% update date="2014-10-09" tags="added,reservations" %}

## <sup>Multiple Rate Plans Reservation</sup>

Reservation with one room type booked, but multiple rate plans/codes contained.

{% code overflow="wrap" expandable="true" %}

```xml
<RoomStays>
	<RoomStay>
		<RoomRates>
			<RoomRate RoomTypeCode="DR" RatePlanCode="RAC" NumberOfUnits="1">
				<Rates>
					<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2013-03-12" ExpireDate="2013-03-14">
						<Total AmountAfterTax="50.00" CurrencyCode="USD"/>
					</Rate>
				</Rates>
			</RoomRate>
			<RoomRate RoomTypeCode="DR" RatePlanCode="RACX" NumberOfUnits="1">
				<Rates>
					<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2013-03-14" ExpireDate="2013-03-15">
						<Total AmountAfterTax="40.00" CurrencyCode="USD"/>
					</Rate>
				</Rates>
			</RoomRate>
		</RoomRates>
		<GuestCounts>
			<GuestCount AgeQualifyingCode="10" Count="1"/>
		</GuestCounts>
		<TimeSpan Start="2013-03-12" End="2013-03-15"/>
		<Total AmountAfterTax="90.00" CurrencyCode="USD"/>
		<BasicPropertyInfo HotelCode="10107"/>
	</RoomStay>
</RoomStays>
```

{% endcode %}
{% endupdate %}

{% update date="2014-07-09" tags="added,reservations" %}

## <sup>ResGuest / Age</sup>

If the guest is a child, the following addition may be sent:

{% code overflow="wrap" expandable="true" %}

```xml
<ResGuest ResGuestRPH="1" ArrivalTime="10:30:00" Age="8">
```

{% endcode %}
{% endupdate %}

{% update date="2014-05-27" tags="added,restrictions" %}

## <sup>Service Inventory Code</sup>

The identifier code for the service as given by the source booking channel will be provided here: @ServiceInventoryCode.

{% code overflow="wrap" expandable="true" %}

```xml
<Services>
	<Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="1" Quantity="2" ID="12345" ID_Context="CHANNEL" Type="18">
		<Price>
			<Base AmountBeforeTax="10.00" AmountAfterTax="11.00" CurrencyCode="USD">
				<Taxes Amount="1.00">
					<Tax Code="19" Percent="10" Amount="1.00">
						<TaxDescription>
							<Text>GST 10 percent</Text>
						</TaxDescription>
					</Tax>
				</Taxes>
			</Base>
			<Total AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="USD">
				<Taxes Amount="10.00">
					<Tax Code="19" Percent="10" Amount="10.00">
						<TaxDescription>
							<Text>GST 10 percent</Text>
						</TaxDescription>
					</Tax>
				</Taxes>
			</Total>
			<RateDescription>
				<Text>Extra person charge $10.00 for cot</Text>
			</RateDescription>
		</Price>
		<ServiceDetails>
			<TimeSpan End="2013-03-15" Start="2013-03-11"/>
		</ServiceDetails>
	</Service>
</Services>
```

{% endcode %}
{% endupdate %}

{% update date="2014-05-15" tags="added,reservations" %}

## <sup>Services / Price / Base</sup>

Added the amount per unit for extra extra charge as provided by the hotel.

{% code overflow="wrap" expandable="true" %}

```xml
<Services>
	<Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="1" Quantity="2" ID="12345" ID_Context="CHANNEL" Type="18">
		<Price>
			<Base AmountBeforeTax="10.00" AmountAfterTax="11.00" CurrencyCode="USD">
				<Taxes Amount="1.00">
					<Tax Code="19" Percent="10" Amount="1.00">
						<TaxDescription>
							<Text>GST 10 percent</Text>
						</TaxDescription>
					</Tax>
				</Taxes>
			</Base>
			<Total AmountBeforeTax="100.00" AmountAfterTax="110.00" CurrencyCode="USD">
				<Taxes Amount="10.00">
					<Tax Code="19" Percent="10" Amount="10.00">
						<TaxDescription>
							<Text>GST 10 percent</Text>
						</TaxDescription>
					</Tax>
				</Taxes>
			</Total>
			<RateDescription>
				<Text>Extra person charge $10.00 for cot</Text>
			</RateDescription>
		</Price>
		<ServiceDetails>
			<TimeSpan End="2013-03-15" Start="2013-03-11"/>
		</ServiceDetails>
	</Service>
</Services>
```

{% endcode %}
{% endupdate %}

{% update date="2014-03-30" tags="modified,reservations" %}

## <sup>CustLoyalty replaces Memberships</sup>

The Memberships node in HotelReservation / ResGlobalInfo is removed and is replaced by CustLoyalty node under Profiles / ProfileInfo / Profile / Customer.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
	<ProfileInfo>
		<UniqueID Type="16" ID="12345" ID_Context="CHANNEL"/>
		<Profile ProfileType="1">
			<Customer>
				<CustLoyalty MembershipID="1234567890" ProgramID="FrequentFlyer" ExpiryDate="2017-03-31"/>
			</Customer>
		</Profile>
	</ProfileInfo>
</Profiles>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2013

{% updates format="full" %}
{% update date="2014-06-10" tags="added,reservations" %}

## <sup>Secondary Point Of Sale Company Code</sup>

Attribute 'Code' added to the CompanyName node for **secondary** channels. This will be relayed as provided from the source booking engine.

{% code overflow="wrap" expandable="true" %}

```xml
<POS>
    <Source>
        <RequestorID Type="22" ID="SITEMINDER"/>
        <BookingChannel Primary="true" Type="7">
            <CompanyName Code="ABC">Booking Channel</CompanyName>
        </BookingChannel>
    </Source>
    <Source>
        <BookingChannel Primary="false" Type="7">
            <CompanyName Code="ABCD">Booking Channel Affilate</CompanyName>
        </BookingChannel>
    </Source>
</POS>
```

{% endcode %}
{% endupdate %}

{% update date="2014-06-10" tags="added,reservations" %}

## <sup>Market Code for RoomStay</sup>

Attribute MarketCode to be added to the RoomStay node. This will be relayed as provided by the source booking engine.

{% code overflow="wrap" expandable="true" %}

```xml
<RoomStay MarketCode="Corporate">
</RoomStay>
```

{% endcode %}
{% endupdate %}

{% update date="2014-06-10" tags="added,reservations" %}

## <sup>Comments for ResGlobalInfo</sup>

Comments node to be added to the ResGlobalInfo node. This will be relayed as provided by the source booking engine.

{% code overflow="wrap" expandable="true" %}

```xml
<ResGlobalInfo>
	<Comments>
		<Comment>
			<Text>will be arriving after 6 pm</Text>
		</Comment>
	</Comments>
</ResGlobalInfo>
```

{% endcode %}
{% endupdate %}
{% endupdates %}


# Credit Card Tokenization

Securely handle credit card data through certified third-party proxy providers for PCI compliance.

## What is Credit Card Tokenization?

**Credit Card Tokenization** is a secure payment handling solution where credit card details in reservations are tokenized by a certified third-party proxy service provider before reaching your PMS. This approach allows PMS systems to receive and process payment information while maintaining PCI DSS compliance without handling raw credit card data directly.

The tokenization proxy sits between SiteMinder and your PMS, intercepting reservation data to replace sensitive card details with secure tokens that your PMS can safely store and process.

{% hint style="danger" %}
**PCI Compliance Note:** To comply with PCI regulations, reservations cannot include both the **CardNumber** and **CVV/CVC code**. Hotels can retrieve CVV/CVC codes directly from the booking channel's extranet.
{% endhint %}

## How It Works

### **For Reservations PULL**

1. **PMS Request**: The PMS sends an `OTA_ReadRQ` request to the proxy service provider.
2. **Proxy Forwarding**: The proxy forwards the `OTA_ReadRQ` to SiteMinder on behalf of the PMS.
3. **Tokenization & Delivery**: The proxy retrieves undelivered reservations from SiteMinder, tokenizes credit card details, and sends the reservations to the PMS with tokenized payment data.

{% hint style="warning" %}
**Tokenization Scope:** For tokenization for **selected properties** include `@HotelCode` in the `OTA_ReadRQ`. For tokenization for **all properties** `@HotelCode` is not required.
{% endhint %}

### **For Reservations PUSH**

1. **SiteMinder Push**: SiteMinder sends reservation notifications (`OTA_HotelResNotifRQ`) to the proxy service provider endpoint.
2. **Tokenization**: The proxy intercepts the reservation, tokenizes the credit card details in real-time.
3. **Forwarded Delivery**: The proxy forwards the tokenized reservation to the PMS endpoint immediately.

## Prerequisites

### **Partnership Agreements**

Before implementing Credit Card Tokenization, the following agreements must be in place:

* **PMS Level**: The PMS must sign an agreement with the chosen proxy service provider.
* **Property Level**: Each hotel or hotel group must sign an agreement with SiteMinder authorizing the use of the third-party proxy service provider to transmit reservations to their PMS.

### **Certified Proxy Providers**

SiteMinder currently supports the following certified tokenization providers:

* FreedomPay (PUSH only)
* Payrails (PULL only)
* PCI Proxy (PULL only)
* Shift4 (PULL and PUSH)

{% hint style="success" %}
To request certification of a new tokenization provider, reach out to our Ecosystems team via <ecosystem.team@siteminder.com>.
{% endhint %}

## Implementation Process

### **Pilot Certification**

1. SiteMinder provides the PMS Partner with a test account and Direct Booking engine test URL.
2. The PMS Partner conducts reservation tests with and without credit card details to verify tokenization is applied correctly.
3. Upon successful certification, the pilot hotel/hotel group can begin live operations.

### **Onboarding Additional Properties**

Each new hotel or hotel group requires a signed agreement with SiteMinder before activation (see Prerequisites above).

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# SiteConnect

Connect your booking channel to SiteMinder with SiteConnect — an API for real-time updates on availability, restrictions, rates, and reservation management.

SiteConnect connects booking channels with direct contractual property relationships to the SiteMinder Distribution Platform. Built on Open Travel Alliance standards, it delivers real-time rates, availability, and restrictions via push, while handling reservations, modifications, and cancellations — across OTAs, GDS, booking engines, and wholesalers.

### Key Benefits

* **Global Reach:** Connect to thousands of properties worldwide via the SiteMinder Platform.
* **Real-Time Accuracy:** Maintain consistent rate, availability, and restriction parity with direct hotel updates.
* **Comprehensive Functionality:** Manage rates, availability, restrictions, and full booking lifecycle.
* **Robust & Reliable:** 99.95% uptime guarantee with end-to-end encryption and ISO 27001 compliance.

### Next Steps

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4><i class="fa-circle-bolt" style="color:blue;">:circle-bolt:</i></h4></td><td><strong>Quick Start</strong></td><td></td><td><a href="/pages/ALxLZL6VqfAzmyft5Rmd">/pages/ALxLZL6VqfAzmyft5Rmd</a></td></tr><tr><td><h4><i class="fa-signs-post" style="color:blue;">:signs-post:</i></h4></td><td><strong>Integration Requirements</strong></td><td></td><td><a href="/pages/cqRPfKMmxJM7XZog4O7Z">/pages/cqRPfKMmxJM7XZog4O7Z</a></td></tr><tr><td><h4><i class="fa-code" style="color:blue;">:code:</i></h4></td><td><strong>API Overview</strong></td><td></td><td><a href="/pages/r62XJhbwlkj7RcUczIPn">/pages/r62XJhbwlkj7RcUczIPn</a></td></tr></tbody></table>

***

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Quick Start

Everything you need to begin building with SiteConnect API.

SiteConnect connects your booking channel with SiteMinder's distribution platform. Through SiteConnect, your channel can provide room type and rate plan mapping configuration, receive availability, restrictions, and rates from SiteMinder, and push reservations, modifications, and cancellations.

**API Operations:**

* **Configuration**: Rooms and Rates
* **Inventory**: Availability, Restrictions, Rates (PDP and OBP)
* **Reservations**: Push

{% hint style="success" %}
Explore all operations in the [API Overview](/siteconnect-api/guides/api-overview).
{% endhint %}

***

## Before You Begin

{% hint style="info" %}
**You don't need to wait for your test environment to start development.** You can begin building and testing immediately. See [Make Your First Call](#make-your-first-call) below or explore requests directly in the [Postman](#explore-with-postman) collection.
{% endhint %}

### Partnership Required

Access to SiteConnect requires an active partnership agreement with SiteMinder. Once \
your agreement is in place, our Partner Integrations team will reach out to initiate \
your integration.

<a href="https://www.siteminder.com/integrations/apply-now/" class="button primary">Become a SiteMinder Partner</a>

### What You'll Provide to SiteMinder

When your integration begins, we'll send you an initiation email requesting the\
following. Having these ready helps us set up your test account:

<table><thead><tr><th width="160">Item</th><th>Details</th></tr></thead><tbody><tr><td>Inventory SOAP endpoint</td><td>Your HTTPS endpoint URL for Rooms and Rates,<br>Availability and Restrictions, and Rates</td></tr><tr><td>Credentials</td><td><code>username</code> and <code>password</code> for<br>SiteMinder to authenticate against your Inventory SOAP endpoint</td></tr><tr><td>Hotel Code</td><td><code>HotelCode</code></td></tr><tr><td>Pricing Model</td><td>Whether you'll implement <a href="/pages/IsscPi0LSnyKxp0i9aTW#per-day-pricing-pdp">Per Day Pricing (PDP)</a> or Occupancy <a href="/pages/IsscPi0LSnyKxp0i9aTW#occupancy-based-pricing-obp">Based Pricing (OBP)</a>. You can only certify one pricing model, which will apply across all your properties.</td></tr></tbody></table>

### What You'll Receive from SiteMinder

Once SiteMinder has received your details, we will provide:

<table><thead><tr><th width="174.0133056640625">Item</th><th>Details</th></tr></thead><tbody><tr><td>Reservation SOAP endpoint</td><td><a href="https://tpi-cm-apac.preprod.siteminderlabs.com/siteconnect/services">https://tpi-cm-apac.preprod.siteminderlabs.com/siteconnect/services</a></td></tr><tr><td>Credentials</td><td><code>username</code> and <code>password</code></td></tr><tr><td>Identifier</td><td><code>RequestorID</code> (Channel Code)</td></tr><tr><td>Hotel Test Account</td><td>Platform that includes pre-configured room types and rate plans, an inventory simulator to push availability, restrictions, and rates, and to verify pushed reservations.</td></tr></tbody></table>

***

## Set Up Your Environment

### Authentication

SiteConnect uses **channel-level authentication** — one set of credentials covers all properties. Credentials are passed via `wsse:UsernameToken` for SOAP requests.

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Header>
  <wsse:Security SOAP-ENV:mustUnderstand="1"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken>
      <wsse:Username>USERNAME</wsse:Username>
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
    </wsse:UsernameToken>
  </wsse:Security>
</SOAP-ENV:Header>
```

{% endcode %}

### API Specification Files

#### SOAP (WSDL)

* **Standard**: <https://tpi-cm-siteconn.preprod.siteminderlabs.com/reservation-gateway/services/siteconnect_v1.1.0.wsdl>
* **Inlined (recommended for .NET)**: <https://tpi-cm-siteconn.preprod.siteminderlabs.com/reservation-gateway/services/siteconnect_v1.1.0_inlined.wsdl>

{% hint style="warning" %}
Use the inlined WSDL for .NET clients — the standard version may cause issues with `wsdl.exe` or `svcutil.exe` due to OTA specifications.
{% endhint %}

***

## Make Your First Call

The first operation every SiteConnect integration must implement is [Rooms and Rates](/siteconnect-api/reference/rooms-and-rates) — SiteMinder calls your endpoint to retrieve the room type and rate plan mapping configured in your system for a given property. This mapping is the foundation for all subsequent inventory and reservation operations.

{% hint style="info" %}
SiteMinder initiates this call — your endpoint must be live, accepting incoming requests, and returning a valid room and rate configuration in the response before we can set up your dedicated test environment.
{% endhint %}

{% stepper %}
{% step %}

### Prepare your endpoint

Your endpoint must accept `OTA_HotelAvailRQ` SOAP requests over HTTPS and return responses with content type `text/xml; charset=utf-8`. SiteMinder will send the following request to retrieve room and rate mapping for a given property:

{% code overflow="wrap" expandable="true" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
    <wsse:Security SOAP-ENV:mustUnderstand="1"
      xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:UsernameToken>
        <wsse:Username>USERNAME</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
      </wsse:UsernameToken>
    </wsse:Security>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <OTA_HotelAvailRQ
      xmlns="http://www.opentravel.org/OTA/2003/05"
      EchoToken="ed8835ff-6198-4f38-b589-3058397f677c"
      TimeStamp="2024-07-06T15:27:41+00:00"
      Version="1.0"
      AvailRatesOnly="true">
      <AvailRequestSegments>
        <AvailRequestSegment AvailReqType="Room">
          <HotelSearchCriteria>
            <Criterion>
              <HotelRef HotelCode="HOTELCODE"/>
            </Criterion>
          </HotelSearchCriteria>
        </AvailRequestSegment>
      </AvailRequestSegments>
    </OTA_HotelAvailRQ>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endcode %}
{% endstep %}

{% step %}

### Validate credentials

Your endpoint must validate the `wsse:UsernameToken` on every incoming request. If the credentials do not match, return the following error response:

{% code overflow="wrap" expandable="true" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="4" Code="448">Invalid Username and/or Password</Error>
			</Errors>
		</OTA_HotelAvailRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endcode %}

{% hint style="warning" %}
**Invalid Username and/or Password** — Return this error when the `wsse:Username` and `wsse:Password` in the incoming request do not match your configured credentials.
{% endhint %}
{% endstep %}

{% step %}

### Validate hotel code

Your endpoint must verify that the `HotelCode` in the request matches a property configured in your system. If not found, return the following error response:

{% code overflow="wrap" expandable="true" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailRS xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="6" Code="392">Hotel not found for HotelCode=XXXXXX</Error>
			</Errors>
		</OTA_HotelAvailRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endcode %}

{% hint style="warning" %}
**Hotel not found for HotelCode=XXXXXX** — Return this error when the `HotelCode` in the incoming request does not match any property configured in your system.
{% endhint %}
{% endstep %}

{% step %}

### Return a Rooms and Rates response

Once credentials and hotel code are validated, return an `OTA_HotelAvailRS` response containing the room types and rate plans configured for the requested property.

SiteMinder requires at least **two room types**, each with at least **two rate plans**.

{% code overflow="wrap" expandable="true" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <OTA_HotelAvailRS xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
      <Success/>
      <RoomStays>
        <RoomStay>
          <RoomTypes>
            <RoomType RoomTypeCode="SGL">
              <RoomDescription Name="Single Room">
                <Text>Single bed for single occupancy.</Text>
              </RoomDescription>
              <Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>
            </RoomType>
          </RoomTypes>
          <RatePlans>
            <RatePlan RatePlanCode="BAR">
              <RatePlanDescription Name="Best Available Rate">
                <Text>Best Available Rate.</Text>
              </RatePlanDescription>
            </RatePlan>
          </RatePlans>
        </RoomStay>
        <!-- Additional RoomStay elements for each room type / rate plan combination -->
      </RoomStays>
    </OTA_HotelAvailRS>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endcode %}
{% endstep %}
{% endstepper %}

{% hint style="success" %}
**You're ready for the next step.** Once your endpoint handles the scenarios above,\
reply to your initiation email with your endpoint URL, credentials, hotel code, and\
pricing model. We'll get your dedicated test account set up for you shortly.
{% endhint %}

## Explore with Postman

SiteMinder's SiteConnect Postman workspace contains collections and environments to help you build, test, and validate your integration for certification. Fork the collections and environments to your own Postman account to get started.

→ [SiteConnect Postman Workspace](https://www.postman.com/siteminder-apis/siteconnect/overview)

### Authentication Details

Update the environment variables with your credentials once your test environment is set up.

{% hint style="info" %}
For full certification scenario coverage, see [Testing and Certification](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/testing-and-certification).
{% endhint %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Integration Requirements

Technical standards, security protocols, and compliance requirements that apply across all SiteConnect API operations.

This page defines the technical standards, security protocols, and operational requirements that apply across all SiteConnect API operations. These requirements ensure reliable, secure, and efficient connectivity between your booking channel and the SiteMinder platform.

## Compliance Policy

All integration partners must adhere to these requirements. Due to the growing number of partner integrations, SiteMinder can no longer accommodate exceptions.

**Non-Compliance Timeline**:

* Partners have **90 days** to remediate non-compliance issues after notification.
* Failure to comply may result in interface deactivation.
* **Critical issues** affecting production stability may result in **immediate temporary suspension**.

***

## Technical Foundation

**Open Travel Alliance (OTA) Specifications**

The SiteConnect API is built on Open Travel Alliance (OTA) version 2010A specifications. Integration developers should be familiar with these standards, available at [http://www.opentravel.org](http://www.opentravel.org/). While this documentation is comprehensive, the OTA specifications provide additional context for complex scenarios and edge cases.

**SOAP Protocol Requirements**

SiteConnect **exclusively** supports **SOAP 1.1**.

**Message Structure Standards**:

* All messages follow SOAP envelope structure
* OTA message must be within `<SOAP-ENV:Body>`
* Requests include SOAP Security Header (see [Security](#security))
* Responses use empty SOAP Header: `<SOAP-ENV:Header/>`
* Content-Type: `text/xml; charset=utf-8` (no other Content-Types accepted)
* Character Encoding: UTF-8 exclusively

{% hint style="danger" %}
SOAP 1.2, REST, or other protocols are **not supported**. Systems using alternative protocols must be modified to use SOAP 1.1.
{% endhint %}

***

## Security

### Transport Layer Security

**Minimum Standard**: TLS 1.2 or higher

**Requirements**:

* All communication **must** use HTTPS over port 443
* HTTP (non-secure) connections are **prohibited**
* Production endpoints must use valid SSL certificates
* Self-signed certificates are **not supported**

### Authentication

**Method**: WS-Security (WSSE) UsernameToken (username and password)

All SOAP requests include a Security Header with credentials transmitted as plain text within the HTTPS encrypted channel.

**Authentication Scope**:

* One set of credentials covers all properties in your integration
* Same credentials used for all API operations
* Your endpoint validates credentials on every request
* Invalid credentials return SOAP fault with error code

{% hint style="success" %}
**Security Header Format**: See individual API operation pages for complete examples.
{% endhint %}

### Strong Password Policy

**Minimum Requirements**:

* At least **12 characters** long
* Mix of uppercase and lowercase letters
* At least one number
* At least one special character (e.g., `!` `@` `#` `?` `]`)

**Example Strong Password**: `MyP@ssw0rd2024!Secure`

{% hint style="warning" %}
**Restricted Characters**: Do **NOT** use the characters `<` `>` `&` `"` `'` in usernames or passwords as they cause XML parsing issues.
{% endhint %}

### IP Whitelisting (Optional)

Partners may whitelist our IPs for additional security.

**Pre-Production IPs**:

* `52.13.134.140`
* `34.213.128.113`
* `35.164.250.223`

**Production IPs**: Provided by Partner Integrations team during go-live.

{% hint style="success" %}
All SiteMinder requests originate from **port 443** (HTTPS).
{% endhint %}

### Firewall and WAF Configuration

If your endpoint sits behind a web application firewall (WAF), CDN, or reverse proxy such as **Cloudflare**, ensure it does not block SiteMinder requests based on the HTTP `User-Agent` header.

The SiteConnect application posts messages with the following User-Agent: `Jakarta Commons-HttpClient/3.1`

Several WAFs block this value by default. For example, Cloudflare rejects it with **HTTP 403** and **error code 1010** (banned browser signature), returning an HTML error page instead of processing the message.

**Action required**:

* Allowlist requests carrying the `Jakarta Commons-HttpClient/3.1` User-Agent, originating from SiteMinder's whitelisted IPs.
* Do not apply User-Agent–based bot or browser-integrity rules to SiteConnect traffic.

{% hint style="warning" %}
**Fixed value**: SiteConnect runs on SiteMinder's established platform, so this User-Agent is fixed and cannot be changed per partner. Your WAF rules must accommodate it.
{% endhint %}

***

## Message Standards

### EchoToken (Request Identifier)

**Purpose**: Unique identifier for request/response correlation and troubleshooting.

**Requirements**:

* **Must be unique** for every request
* Both request and response include the **same** EchoToken
* Used for log searching and debugging across environments
* **Format**: UUID with `8-4-4-4-12` pattern

**Example**: `ed8835ff-6198-4f38-b589-3058397f677c`

{% hint style="warning" %}
**Critical for Support**: Highly unique EchoTokens enable efficient troubleshooting. Sequential numbers or timestamp-only values slow issue resolution significantly.
{% endhint %}

### TimeStamp Format

**Standard**: ISO 8601 Date and Time format

**Accepted Formats**:

**UTC Time** (recommended):

```
2024-11-19T13:15:30Z
```

**Local Time with Offset**:

```
2024-11-19T08:15:30-05:00
```

{% hint style="success" %}
**Best Practice**: Use UTC timestamps (with `Z` suffix) to eliminate timezone confusion and simplify troubleshooting.
{% endhint %}

### XML Formatting Requirements

**Production Requirement**: Minified XML (single line, no whitespace)

All SOAP XML messages sent to SiteMinder **must be minified**, removing line breaks, newlines, and unnecessary whitespace. Single-line XML enables support teams to efficiently extract complete messages from logs using text searches.

**Correct Format**:

{% code overflow="wrap" %}

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><OTA_HotelAvailRS xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41Z" Version="1.0"><Success/><RoomStays><RoomStay><RoomTypes><RoomType RoomTypeCode="SGL"><RoomDescription Name="Single Room"><Text>Single bed for single occupancy.</Text></RoomDescription><Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/></RoomType></RoomTypes><RatePlans><RatePlan RatePlanCode="BAR"><RatePlanDescription Name="Best Available Rate"><Text>Best Available Rate.</Text></RatePlanDescription></RatePlan></RatePlans></RoomStay></RoomStays></OTA_HotelAvailRS></SOAP-ENV:Body></SOAP-ENV:Envelope>
```

{% endcode %}

**Incorrect Format**:

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41Z" Version="1.0">
			<Success/>
			<RoomStays>
				<!-- ... other elements and attributes have been omitted for brevity ... -->
			</RoomStays>
		</OTA_HotelAvailRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

### API Version and Namespace

**API Version**: `1.0`

All OTA messages must include `Version="1.0"` attribute in the root element.

**XML Namespace**: `http://www.opentravel.org/OTA/2003/05`

All OTA messages must declare this namespace using the `xmlns` attribute in the root element.

***

## Configuration

### Endpoint Requirements

**Your Endpoint Standards** (Partner Provides):

**Mandatory Requirements**:

* Must use **registered domain name** (direct IP addresses not supported)
* Must be accessible via HTTPS on port 443
* Must accept SOAP 1.1 messages with proper Content-Type

**Configuration Options**:

**Option 1 - Single Endpoint** (Recommended):

* One URI handles all message types (`OTA_HotelAvailRQ`, `OTA_HotelAvailNotifRQ`, `OTA_HotelRateAmountNotifRQ`)
* Simplifies configuration and maintenance

**Option 2 - Dual Endpoints**:

* Separate endpoints for different operations:
  * **Endpoint 1**: Rooms and Rates (`OTA_HotelAvailRQ`)
  * **Endpoint 2**: Inventory Updates (`OTA_HotelAvailNotifRQ`, `OTA_HotelRateAmountNotifRQ`)

{% hint style="success" %}
If architectural constraints require separate endpoints, inform Partner Integrations during setup. SiteMinder can accommodate up to two URIs.
{% endhint %}

### Reservation Delivery Endpoint

**Production Endpoint Update**: SiteMinder now uses a **single global endpoint** for all reservation delivery, replacing the previous regional endpoint model (APAC and EMEA/AMERS). If your integration currently uses region-specific endpoints, please contact the [Partner Integrations](https://developer.siteminder.com/siteminder-apis/integration-process) team to migrate to the global endpoint for simplified routing and improved reliability.

**Endpoint Details**: See [Reservations](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/reservations) for complete endpoint specifications.

### Property Identification (HotelCode)

**Definition**: Unique identifier assigned by your booking channel for each property.

**Requirements**:

* Must be **unique per property per channel**
* Used consistently across all API operations
* Cannot be changed without re-mapping (causes service disruption)

**Format**: Alphanumeric string (your choice)

**Examples**: `PROP12345`, `LONDON001`, `HTL987654`

{% hint style="warning" %}
**Important**: Choose a logical, scalable `HotelCode` format upfront. Changing codes post-production requires coordination and causes temporary service disruption.
{% endhint %}

### RequestorID / Channel Code

**Definition**: Unique identifier for your booking channel integration.

**Usage**:

* **SOAP Messages**: `<RequestorID Type="22" ID="ABC"/>`

**Requirements**:

* Must match across all reservation messages
* Case-sensitive
* Provided by SiteMinder during setup

### Reservation UniqueID

**Purpose**: Identifies a reservation throughout its lifecycle.

**Requirements**:

* The `UniqueID ID` must be unique across all properties connected through the integration.
* A previously used ID must never be assigned to another reservation, including reservations for a different property.
* If SiteMinder receives a reservation with an ID that has already been used, the reservation will be ignored.
* The same ID must be retained for subsequent updates or cancellations relating to the original reservation.

**Recommended Format**:

* Use at least **7 numeric characters**.
* Alphanumeric values are encouraged to increase the number of possible combinations and reduce the risk of reuse.

{% hint style="danger" %}
`UniqueID` `ID` must contain only alphanumeric characters (A-Z, a-z, 0-9). Special characters must be avoided.
{% endhint %}

***

## Performance and Reliability

### Response Time Requirements

**Target Performance** (per request):

* **Ideal**: Sub-1-second response
* **Acceptable**: 1-2 seconds average
* **Timeout**: 20 seconds (failsafe, **not a target**)

{% hint style="danger" %}
**Critical**: The 20-second timeout is a failsafe mechanism, not a performance goal. Responses consistently approaching 10+ seconds indicate performance issues requiring immediate attention.
{% endhint %}

**Response Behaviour**:

* Respond with `<Success/>` or `<Errors>` immediately
* Acknowledge receipt promptly
* Process asynchronously if downstream operations take time
* Do not delay HTTP response while performing internal processing

### Scalability Expectations

**Data Volume Considerations**:

* Initial bulk loads: Up to **750 days** of inventory data
* Ongoing updates: Minimum **365 days** from current date (configurable)
* Multiple concurrent property updates
* Peak periods during new property go-lives and seasonal changes

**Testing Requirements**:

* Test with production-scale data volumes
* Simulate concurrent property updates
* Verify sustained load performance
* Test recovery from failures

{% hint style="success" %}
**Best Practice**: Over-provision capacity by 50% to handle unexpected spikes during peak booking periods and simultaneous property onboarding.
{% endhint %}

### Error Handling

**Mandatory Capabilities**:

Your application **must** implement:

**1. Robust Error Detection**

* Validate all requests against OTA schema
* Detect authentication failures immediately
* Identify malformed XML and missing required fields
* Return proper SOAP faults with appropriate error codes

**2. Queuing Mechanism**

* Queue failed updates for retry
* Persist queue across application restarts
* Prevent duplicate processing
* Monitor queue depth and age

**3. Retry Strategy**

* Implement exponential backoff for transient errors
* Distinguish permanent vs. temporary failures
* Define maximum retry attempts
* Establish escalation path for persistent failures

**Recommended Retry Pattern**:

```
Attempt 1: Immediate (0 seconds)
Attempt 2: 5 seconds
Attempt 3: 15 seconds
Attempt 4: 30 seconds
Attempt 5: 60 seconds
After 5 attempts: Alert + manual intervention
```

**Detailed Guidance**: See [Error Handling](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/technical-guide/error-handling) for complete specifications and error code reference.

### Timezone Handling

**Hotel Timezone Configuration**:

* Hotels configure their local timezone in SiteMinder Channel Manager
* Availability, Restrictions, and Rates reflect hotel's local timezone
* Your system must respect these timezone settings when processing updates

**Server Timestamp Standards**:

* **EMEA region**: Server timestamps in GMT
* **APAC region**: Server timestamps in AEST/AEDT (Australian Eastern Time)

{% hint style="warning" %}
**Partner Responsibility**: Educate hotels using your channel about timezone configuration requirements. Timezone mismatches cause availability conflicts and booking errors.
{% endhint %}

**Implementation Best Practices**:

1. Convert all datetimes to UTC internally for consistent processing
2. Display times in hotel's local timezone in user interfaces
3. Store original timezone offset with temporal data
4. Handle Daylight Saving Time (DST) transitions correctly
5. Validate date ranges respect timezone boundaries

***

## Pre-Production Checklist

Before requesting production access, verify all requirements are met:

### Security & Configuration

* [ ] All endpoints use HTTPS with valid certificates (not self-signed)
* [ ] Authentication credentials meet strong password policy (12+ characters)
* [ ] Endpoints use registered domain names (no direct IPs)
* [ ] TLS 1.2 or higher enabled

### Message Standards

* [ ] EchoTokens are highly unique (UUID/GUID format recommended)
* [ ] XML output is minified (single line, no whitespace)
* [ ] TimeStamps use ISO 8601 format (UTC recommended)
* [ ] Content-Type is `text/xml; charset=utf-8`
* [ ] API Version set to `1.0` in all messages
* [ ] XML Namespace correctly declared

### Performance & Reliability

* [ ] Response times meet targets (<2 seconds typical)
* [ ] Error handling with queue and retry implemented
* [ ] Load testing completed with production data volumes (up to 750 days)
* [ ] Failover and recovery scenarios tested
* [ ] Timezone handling implemented correctly

### Functional Requirements

* [ ] All mandatory test scenarios passed (see [Testing and Certification](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/testing-and-certification))
* [ ] Postman collections executed successfully
* [ ] Operation-specific requirements met (see [API Reference](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference))
* [ ] HotelCode format defined and documented

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Testing and Certification

Test your SiteConnect integration and confirm readiness before going live with SiteMinder.

Use this guide to verify that all required integration capabilities are working correctly. Work through the scenarios independently, and when you're confident in your results, notify the Partner Integrations team. We'll review your readiness, prepare your account, and confirm when you can proceed to certification.

## Instructions

This guide provides a series of scenarios to test all required integration capabilities for this API. Some capabilities may be optional — if a scenario does not apply to your integration, skip it and proceed to the next one. Work through each scenario using the resources provided in the Initial Setup section, and use the results to verify your integration is working correctly before requesting certification.

Once all scenarios pass, notify the Partner Integrations team. We will review your results, and if everything looks good, confirm when you can proceed to the formal certification process.

## Initial Setup

Before working through the test scenarios, make sure the following are in place:

1. **Postman collection** — Download and import the [SiteConnect Postman](https://www.postman.com/siteminder-apis/siteconnect/overview) collection.
2. **Test platform access** — You will need access to our test platform, configured and mapped to your booking channel.
3. **Endpoints** — Ensure your endpoint is active and ready to receive requests.

{% hint style="info" %}
SiteMinder will provide credentials for our test endpoints. You will use your own credentials for your endpoint. **Make sure to replace all variables in the Postman collection before running the scenarios.**
{% endhint %}

For certification purposes we have created two basic room types and two basic rate plans that are ready to be mapped to your booking channel. Please create in your system the same room rates combination to start the certification.

<figure><img src="/files/5owtJkAC54ceHxREiO06" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
If your booking channel doesn't support multiple room types and/or multiple rate plans, create them as possible and let us know.
{% endhint %}

## Test Scenarios

### 1. Retrieve Rooms and Rates

A request is sent to your system each time you access the Room Rates Mapping section of your booking channel in your test Platform. You can trigger a new request by clicking the refresh arrow.

* Ensure that your system provides a `Success` response, displaying all available rooms and rates from your end.
* Confirm that channel room rate names are accurate (e.g., Channel Room A - Channel Rate 1).
* Complete the mapping of the four rate plans created for certification, adding `Occupancy Details`, `Extra / Discounts` and `Channel Inclusions` if supported.
* **Optional**: Test Additional Details, including `NO_RATES`, `NO_AVAILABILITY`, and `NO_UPDATES`.

{% tabs %}
{% tab title="Unmapped" %}

<figure><img src="/files/RmNgLcPAMXvMngvS2LdI" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Map a PDP Rate" %}

<figure><img src="/files/sofY3liu4E24AbvHNZtQ" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Map an OBP Rate" %}

<figure><img src="/files/JkynApIoU8ac2ppWhPzc" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Mapping Completed" %}

<figure><img src="/files/sx5gwnvEPYKdFxH0W3Yr" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

{% hint style="success" %}
To successfully complete this scenario, you must have retrieved all room rates created on your booking channel. The room rates required for certification must have been mapped on your test Platform.
{% endhint %}

### 2. Bulk Data Update

Using the Bulk Update tool, set up Availability, Restrictions, and Rates for the update period configured for your booking channel (e.g., 750 days). These changes will push Availability, Restrictions, and Rates updates to your system, and we expect successful responses. See some examples below:

{% tabs %}
{% tab title="Initial Inventory" %}

<figure><img src="/files/v2lnNyy3X9teHNCg7chi" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Setting Availability" %}

<figure><img src="/files/lUDhRYtJlLv9pSRDkJLA" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Setting Rates" %}

<figure><img src="/files/5a0bYyyggqjBMrLvPMr2" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Setting Stop Sell" %}

<figure><img src="/files/vyHyT8LSOn2dI1HoijJM" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

### **- Availability**

Set availability for both room types starting from today for the update period supported by your booking channel (e.g., 750 days).

| Room Type | Date               | Value |
| --------- | ------------------ | ----- |
| Room A    | Full Update Period | 10    |
| Room B    | Full Update Period | 5     |

### **- Rates**

Set rates for all four room rates starting from today, covering the update period supported by your booking channel (e.g., 750 days).

| Room Type | Rate Plan | Date               | Value |
| --------- | --------- | ------------------ | ----- |
| Room A    | Rate 1    | Full Update Period | 300   |
| Room A    | Rate 2    | Full Update Period | 250   |
| Room B    | Rate 1    | Full Update Period | 400   |
| Room B    | Rate 2    | Full Update Period | 350   |

{% hint style="info" %}
The values above represent the base amount for each rate. Additional amounts are included in the request if `Occupancy Details` and `Extra / Discounts` are configured during the mapping setup.
{% endhint %}

### **- Stop Sell**

Set stop sell for all four room rates starting from today, covering the update period supported by your booking channel (e.g., 750 days).

| Room Type | Rate Plan | Date               | Stop Sell |
| --------- | --------- | ------------------ | --------- |
| Room A    | Rate 1    | Full Update Period | Enabled   |
| Room A    | Rate 2    | Full Update Period | Disabled  |
| Room B    | Rate 1    | Full Update Period | Enabled   |
| Room B    | Rate 2    | Full Update Period | Disabled  |

### **- Close to Arrival (CTA)**

Set close to arrival for all four room rates starting from today, covering the update period supported by your booking channel (e.g., 750 days).

| Room Type | Rate Plan | Date               | CTA      |
| --------- | --------- | ------------------ | -------- |
| Room A    | Rate 1    | Full Update Period | Enabled  |
| Room A    | Rate 2    | Full Update Period | Disabled |
| Room B    | Rate 1    | Full Update Period | Enabled  |
| Room B    | Rate 2    | Full Update Period | Disabled |

### **- Close to Departure (CTD)**

Set close to departure for all four room rates starting from today, covering the update period supported by your booking channel (e.g., 750 days).

| Room Type | Rate Plan | Date               | CTD      |
| --------- | --------- | ------------------ | -------- |
| Room A    | Rate 1    | Full Update Period | Enabled  |
| Room A    | Rate 2    | Full Update Period | Disabled |
| Room B    | Rate 1    | Full Update Period | Enabled  |
| Room B    | Rate 2    | Full Update Period | Disabled |

### **- Minimum Stay**

Set minimum stay for all four room rates starting from today, covering the update period supported by your booking channel (e.g., 750 days).

| Room Type | Rate Plan | Date               | Min. Stay |
| --------- | --------- | ------------------ | --------- |
| Room A    | Rate 1    | Full Update Period | 1         |
| Room A    | Rate 2    | Full Update Period | 7         |
| Room B    | Rate 1    | Full Update Period | 1         |
| Room B    | Rate 2    | Full Update Period | 7         |

### **- Maximum Stay**

Set maximum stay for all four room rates starting from today, covering the update period supported by your booking channel (e.g., 750 days).

| Room Type | Rate Plan | Date               | Max. Stay |
| --------- | --------- | ------------------ | --------- |
| Room A    | Rate 1    | Full Update Period | 7         |
| Room A    | Rate 2    | Full Update Period | 30        |
| Room B    | Rate 1    | Full Update Period | 7         |
| Room B    | Rate 2    | Full Update Period | 30        |

{% hint style="info" %}
Min. Stay and Max. Stay are by default configured on Arrival (`SetMinLOS` and `SetMaxLOS`). To switch to Min. Stay Through and Max. Stay Through (`SetForwardMinStay` and `SetForwardMaxStay`) set **Use stay through** to `Yes` in your `Channel Settings`.
{% endhint %}

<figure><img src="/files/iStiPg1TWVwyP1gDkrOY" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Use the `View by` and `Select a data type to display` options to easily review changes made on your test platform.
{% endhint %}

{% tabs %}
{% tab title="Availability" %}

<figure><img src="/files/9r7WbYvH3GpVCumYSSuo" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Rates" %}

<figure><img src="/files/7ntmoPlVsvxODw7EzGxK" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Stop Sell" %}

<figure><img src="/files/83uJPh1XcRl5mcRT4uy7" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="CTA" %}

<figure><img src="/files/VyG9XmKpFmrOujFCME3H" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="CTD" %}

<figure><img src="/files/NVMaTEEhMXdOljlThSTn" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Min. Stay" %}

<figure><img src="/files/S3lkkDvbsSgsqXU8FJqh" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Max. Stay" %}

<figure><img src="/files/KHEWaNb2Pj3PY0NTp8Yy" alt=""><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

{% hint style="success" %}
To successfully complete this scenario, your booking channel must have accepted and processed the Availability, Restrictions, and Rates updates sent. Your system must display the same data as your test Platform.
{% endhint %}

### 4. Targeted Data Update

This scenario tests updates where only specific data points, like a single rate change or availability adjustment, are sent for a short period, verifying the system’s ability to handle minimal data updates efficiently and accurately.

To complete this scenario, first select any future month within the next year. Then, for each specified day in the table (e.g., Day 1, Day 2, Day 5), apply the changes using the corresponding dates within that chosen month. For example, if you select March, use March 1 for Day 1, March 2 for Day 2, and March 5 for Day 5.

### - Availability

Set availability for the following room type and date.

| Room Type | Date  | Availability |
| --------- | ----- | ------------ |
| Room A    | Day 1 | 0            |

<figure><img src="/files/q21zuNPD6rz2WTpfLP9R" alt=""><figcaption></figcaption></figure>

### - Restrictions

Set restrictions for the following room rates and dates.

| Room Type | Rate Plan | Date            | Restriction      |
| --------- | --------- | --------------- | ---------------- |
| Room A    | Rate 2    | Day 3           | Enable Stop Sell |
| Room A    | Rate 2    | Day 4           | Enable CTA       |
| Room A    | Rate 2    | Day 7           | Enable CTD       |
| Room A    | Rate 2    | Day 1 to Day 28 | Min. Stay to 2   |
| Room A    | Rate 2    | Day 1 to Day 28 | Max. Stay to 3   |

<figure><img src="/files/lC9zezCQk0jqi98dx8oj" alt=""><figcaption></figcaption></figure>

### - Rates

Set rates for the following room rates and dates.

| Room Type | Rate Plan | Date             | Value |
| --------- | --------- | ---------------- | ----- |
| Room A    | Rate 2    | Day 15 to Day 17 | 200   |
| Room A    | Rate 2    | Day 18           | 300   |
| Room A    | Rate 2    | Day 20 to Day 21 | 350   |

<figure><img src="/files/iYP3mlzCeMaEreVaS41s" alt=""><figcaption></figcaption></figure>

If your booking channel supports `Occupancy Details`, `Extra / Discounts` and `Channel Inclusions`, ensure that the received rate data is processed accordingly. Below are the expected outcomes for both pricing models: `Per Day Pricing` and `Occupancy Based Pricing` using the rate update for the `Room A - Rate 2` on the `Day 18` for `300` as an example:

{% tabs %}
{% tab title="Per Day Pricing" %}

<figure><img src="/files/RzY68azpk15sg5zQBST3" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/OpzN0bF6krDgYU7LoyMQ" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Rate Update XML " %}

```xml

<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-03-18" InvTypeCode="ROOMA" RatePlanCode="RATE2" Start="2025-03-18"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="250.00" CurrencyCode="EUR" NumberOfGuests="1"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="2"/>
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="10" Amount="100" CurrencyCode="EUR"/>
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/>
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary Apartment with private balcony or courtyard. Large living and dining area with fully equipped kitchen. Features a separate bedroom and bathroom and laundry facilities.</Text>
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Values" %}

| Rate for 1 adult  | 250                                                                                                                                                                                  |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Rate for 2 adults | 300                                                                                                                                                                                  |
| Rate for 3 adults | 400                                                                                                                                                                                  |
| Rate for 4 adults | 500                                                                                                                                                                                  |
| Rate for 5 adults | 600                                                                                                                                                                                  |
| Extra Child Rate  | 50                                                                                                                                                                                   |
| Inclusions        | Contemporary Apartment with private balcony or courtyard. Large living and dining area with fully equipped kitchen. Features a separate bedroom and bathroom and laundry facilities. |
| {% endtab %}      |                                                                                                                                                                                      |
| {% endtabs %}     |                                                                                                                                                                                      |

{% tabs %}
{% tab title="Occupancy Based Pricing" %}

<figure><img src="/files/MmzB2H1fJgZx2SRLhKgD" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/OpzN0bF6krDgYU7LoyMQ" alt=""><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Rate Update XML " %}

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-03-18" InvTypeCode="ROOMA" RatePlanCode="RATE2" Start="2025-03-18"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="250.00" CurrencyCode="EUR" NumberOfGuests="1"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="2"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="400.00" CurrencyCode="EUR" NumberOfGuests="3"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="500.00" CurrencyCode="EUR" NumberOfGuests="4"/>
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/>
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary Apartment with private balcony or courtyard. Large living and dining area with fully equipped kitchen. Features a separate bedroom and bathroom and laundry facilities.</Text>
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Values" %}

| Rate for 1 adult  | 250                                                                                                                                                                                  |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Rate for 2 adults | 300                                                                                                                                                                                  |
| Rate for 3 adults | 400                                                                                                                                                                                  |
| Rate for 4 adults | 500                                                                                                                                                                                  |
| Rate for 5 adults | Maximum Occupancy is 4                                                                                                                                                               |
| Extra Child Rate  | 50                                                                                                                                                                                   |
| Inclusions        | Contemporary Apartment with private balcony or courtyard. Large living and dining area with fully equipped kitchen. Features a separate bedroom and bathroom and laundry facilities. |
| {% endtab %}      |                                                                                                                                                                                      |
| {% endtabs %}     |                                                                                                                                                                                      |

{% hint style="success" %}
To successfully complete this scenario, your booking channel must have accepted and processed the Availability, Restrictions, and Rates updates sent. Your system must display the same data as your test Platform.
{% endhint %}

### 5. Reservations

Based on the data pushed to your booking channel during the `Bulk Data Update` and `Targeted Data Update`, you are required to complete the following test scenarios. All successfully created bookings must contain the maximum amount of data your booking channel can handle, including guest and customer details, services, guarantee and deposit information, credit card or virtual credit card information, and more. Any data not received will be deemed as not supported by your booking channel.

Refer to the [Reservations](/siteconnect-api/reference/reservations) section for further details.

{% hint style="warning" %}
For security reasons, always use test credit card details and never real ones when testing reservations. Refer to [Test Credit Cards](/siteconnect-api/additional-resources/reference-tables/test-credit-cards).
{% endhint %}

### **- Booking Limit and Restrictions**

This scenario tests your system’s ability to prevent bookings that don’t meet availability or restriction criteria, verifying that it accurately enforces rules to block reservations when availability or restrictions don’t permit them.

| Reservation | Room Type | Rate Plan | Check in | Check out | Reason       |
| ----------- | --------- | --------- | -------- | --------- | ------------ |
| Attempt 1   | Room A    | Rate 2    | Day 1    | Day 3     | Availability |
| Attempt 2   | Room A    | Rate 2    | Day 2    | Day 4     | Stop Sell    |
| Attempt 3   | Room A    | Rate 2    | Day 4    | Day 6     | CTA          |
| Attempt 4   | Room A    | Rate 2    | Day 5    | Day 7     | CTD          |
| Attempt 5   | Room A    | Rate 2    | Day 8    | Day 9     | Min. Stay    |
| Attempt 6   | Room A    | Rate 2    | Day 10   | Day 14    | Max. Stay    |

### - Daily Rates

This scenario tests your system’s ability to provide a rate breakdown within the `RoomRates` element. Create the following test reservations:

| Reservation | Room Type | Rate Plan | Check in | Check out | Comment                   |
| ----------- | --------- | --------- | -------- | --------- | ------------------------- |
| Booking 01  | Room A    | Rate 2    | Day 15   | Day 18    | Same Value per Night      |
| Booking 02  | Room A    | Rate 2    | Day 17   | Day 20    | Different Value per Night |
| Booking 03  | Room A    | Rate 2    | Day 19   | Day 22    | Combined                  |

{% hint style="info" %}
If your booking channel doesn't provide `Daily Rates`, still create the reservations with the requested room type, rate plan, check in and check out dates.
{% endhint %}

### - Multi Room

This scenario tests your system’s ability to provide reservations with two or more rooms for the same date range and/or consecutive days within the `RoomStays` element. Create the following test reservations:

| Reservation | Room Type | Rate Plan | Check in | Check out |
| ----------- | --------- | --------- | -------- | --------- |
| Booking 04  | Room A    | Rate 2    | Day 22   | Day 28    |
|             | Room B    | Rate 2    | Day 22   | Day 28    |

| Reservation | Room Type | Rate Plan | Check in | Check out |
| ----------- | --------- | --------- | -------- | --------- |
| Booking 05  | Room A    | Rate 2    | Day 22   | Day 25    |
|             | Room B    | Rate 2    | Day 25   | Day 28    |

{% hint style="info" %}
If your booking channel doesn't support `Multi Room` reservations, ignore the reservation Booking 04, but still create the reservations Booking 05 using the same room type.
{% endhint %}

### - Modifications

Modify the following test reservations.

| Reservation | Action             | Comment              |
| ----------- | ------------------ | -------------------- |
| Booking 01  | Remove one night   | New check out Day 17 |
| Booking 02  | Add one night      | New check out Day 21 |
| Booking 04  | Remove Room B      | Only Room A remains  |
| Booking 05  | Change Room A to B | Both are Room B      |

### - Cancellations

Cancel the following test reservations.

| Reservation | Action |
| ----------- | ------ |
| Booking 01  | Cancel |
| Booking 03  | Cancel |
| Booking 05  | Cancel |

{% hint style="success" %}
To successfully complete this scenario, you must have created and sent reservation requests for each test: Daily Rates, Multi Rooms, Modifications, and Cancellations. Our system must display reservation data consistent with your booking channel.
{% endhint %}

### 6. Error Handling

To assist you in testing the [Error Handling](/siteconnect-api/guides/error-handling), use the Postman collection `SiteConnect - Error Handling`. Follow the steps below to begin your testing process.

**Step 1 -** If you haven't already, fork the relevant collection from <https://www.postman.com/siteminder-apis/siteconnect/overview>

**Step 2 -** Update the `SiteConnect` environment with your specific details.

**Step 3 -** Select `Run Collection`.

**Step 4 -** Choose the scenarios you need to run based on whether you’re testing PDP or OBP. Also, set a `Delay` of 2000 ms, enable `Persist responses for a session`, and then select `Run SiteConnect - Error Handling`.

**Step 5 -** After running the collection, a summary will display showing which scenarios passed or failed.

**Step 6 -** Click `View Results` to see more details on each individual test, including the `Request` sent and the `Response` received.

For more details on using Postman, see the articles [Test your API using the Collection Runner](https://learning.postman.com/docs/collections/running-collections/intro-to-collection-runs/).

{% hint style="success" %}
To successfully complete this scenario, you must execute each error handling test in the provided Postman collection. Ensure that your system correctly identifies and responds to errors as specified, with responses consistent with the expected descriptions.
{% endhint %}

## Final Steps

Once all scenarios have passed, notify the Partner Integrations team. We will review your results and confirm when you can proceed to certification. If any issues are identified during the review, we will reach out to you directly to resolve them before moving forward.

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Development Checklist

Use this checklist as a development guideline for the SiteConnect integration.

If you have completed all checkmarks, you are now ready to proceed with the Certification phase. Please contact the Partner Integrations Team for next steps.

#### **Test Environment Access**

* [ ] Access SiteMinder Platform Test Account
* [ ] Configure Reservation Endpoint / Credentials

#### **Must Read**

* [ ] Understand SiteConnect [Integration Requirements](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/integration-requirements)
* [ ] Understand SiteConnect [Project Timeline](https://developer.siteminder.com/siteminder-apis/integration-process)
* [ ] Familiarise with the SOAP Message Structure

#### **Room Retrieval API**

* [ ] Familiarise with [Room Retrieval](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/rooms-and-rates) process

Do you use 'Retrieve Room Codes Only' or 'Retrieve Room Codes and Rate Codes'?

* [ ] Retrieve Room Codes and Rate Codes
* [ ] Retrieve Room Codes Only

Do you use Additional Flags?

* [ ] Restrict Availability or Rate Updates
* [ ] Reservation Only Room Rates

If using OBP model, have you included the MaxOccupancy in the RS?

* [ ] `<Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>`

#### **Room/Rates Mapping**

* [ ] [Video: Connect, map and enable a channel](https://help-platform.siteminder.com/en/articles/9366308-video-connect-map-and-enable-a-channel)
* [ ] Map Room Rates in SiteMinder Platform
  * [ ] If using OBP model, you must add values for the “Included Occupancy”, “Extra Adult“ and “Single Guest Discount”.
* [ ] Enable your Channel (Channel Settings)

#### **Inventory Push API**

* [ ] Familiarise with the supported functionality of the [OTA\_HotelAvailNotifRQ](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/availability-and-restrictions)

Confirm all restrictions you will support:

* [ ] Stop Sell (mandatory)

* [ ] Closed to Arrival

* [ ] Closed to Departure

* [ ] Minimum Stay MinLOS

* [ ] Maximum Stay MaxLOS

* [ ] Minimum Stay Through

* [ ] Maximum Stay Through

* [ ] Test supported functionalities using the Inventory grid of your SiteMinder Platform test account
  * [ ] Help Article: [Update rates, availability, and restrictions](https://help-platform.siteminder.com/en/articles/8674045-update-rates-availability-and-restrictions-in-the-inventory-grid)

* [ ] Check that you received our OTA\_HotelAvailNotifRQ requests.

* [ ] Build correctly formed OTA\_HotelAvailNotifRS with Success or Error response

#### **Rate Push API**

* [ ] Familiarise with supported functionality of the [OTA\_HotelRateAmountNotifRQ](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/rates)

Confirm which pricing model you are supporting (only can choose one):

* [ ] [Per Day Pricing](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/rates#per-day-pricing) (<mark style="color:$primary;">**PDP**</mark>)
* [ ] [Occupancy Based Pricing](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/rates#occupancy-based-pricing) (<mark style="color:green;">**OBP**</mark>)

Confirm all restrictions you will support:

* [ ] Included Occupancy (mandatory for <mark style="color:green;">**OBP**</mark>, optional for <mark style="color:$primary;">**PDP**</mark>)

* [ ] Maximum Occupancy (mandatory for <mark style="color:green;">**OBP**</mark>)

* [ ] Extra Adult Rate (mandatory for <mark style="color:green;">**OBP**</mark>, optional for <mark style="color:$primary;">**PDP**</mark>)

* [ ] Extra Child Rate (optional for <mark style="color:$primary;">**PDP**</mark>)

* [ ] Single Guest Discount (mandatory for <mark style="color:green;">**OBP**</mark>)

* [ ] Inclusions

* [ ] Test Rates using the Inventory grid of your SiteMinder Platform test account
  * [ ] Help Article: [Update rates, availability, and restrictions](https://help-platform.siteminder.com/en/articles/8674045-update-rates-availability-and-restrictions-in-the-inventory-grid)

* [ ] Check that you received our OTA\_HotelRateAmountNotifRQ requests.

* [ ] Build correctly formed OTA\_HotelRateAmountNotifRS with Success or Error response

#### **Reservation API**

* [ ] Familiarise with [Reservation Push](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/reservations) process
* [ ] Build correct OTA\_HotelResNotifRQ for Commit, Modify and Cancel
* [ ] Push test reservations to endpoint/credentials provided in Development Pack Email
* [ ] Based on our OTA\_HotelResNotifRQ Specification, provide [Reservation Maximum Content XML](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/reservations#reservation-xml-samples)

Confirm and test the types of OTA\_HotelResNotifRQ messages you will support:

* [ ] Reservation (one room type)
* [ ] Reservation (multiple room type)
* [ ] Modification
* [ ] Cancellation

Confirm and test the below functionalities you will support:

* [ ] Virtual Credit Card (VCC)
* [ ] Three Domain Security (3DS)

#### **Error Handling**

* [ ] Build required [Error Responses](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/error-handling#sample-error-response) for each API:
  * [ ] Room Retrieval API
  * [ ] Inventory Push API
  * [ ] Rates Push API
    * [ ] Invalid included occupancy (required for <mark style="color:$primary;">**PDP**</mark>)
    * [ ] Invalid number of adults (required for <mark style="color:green;">**OBP**</mark>)


# Error Handling

Learn how to handle and return error messages when using the SiteConnect API, including expected formats, retry strategies, and response codes.

## Responses to SiteMinder <a href="#error-responses-to-siteconnect" id="error-responses-to-siteconnect"></a>

Errors must be returned within a 'SOAP Envelope' and use the defined response message container depending on the message being responded to. See the relevant parts of our specification within the [Rooms and Rates](/siteconnect-api/reference/rooms-and-rates), [Availability and Restrictions](/siteconnect-api/reference/availability-and-restrictions) and [Rates](/siteconnect-api/reference/rates) sections for more information about each error response message.

If the error is specifically related to **application-level** errors, **do not** respond with any other error types (HTTP, etc.). If you have **server-level** issues, then it is OK to respond with HTTP standard error codes.

It is expected that your booking channel has a robust error handling process in place. This includes a queuing mechanism and a robust retry strategy.

An error response must contain a short error description to assist our Support teams.

### Sample Error Response

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
			<Errors>
				<Error Type="6" Code="392">Hotel not found for HotelCode=XXXXXX</Error>
			</Errors>
		</OTA_HotelAvailNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

### Mandatory Error Responses

Building these errors are required. The error descriptions must be the same as shown below.

{% tabs %}
{% tab title="Credentials" %}

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="4" Code="448">Invalid Username and/or Password</Error>
	</Errors>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="Hotel Code" %}

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="6" Code="392">Hotel not found for HotelCode=XXXXXX</Error>
	</Errors>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="Room Code" %}

```xml
<OTA_HotelAvailNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="12" Code="402">Room type code not found for this hotel</Error>
	</Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Rate Code" %}

```xml
<OTA_HotelAvailNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="12" Code="249">Rate code not found for this hotel</Error>
	</Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}
{% endtabs %}

| Error Description                       | Mandatory                                                                                                                      |
| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| Invalid Username and/or Password        | <p><code>OTA\_HotelAvailRS</code></p><p><code>OTA\_HotelAvailNotifRS</code></p><p><code>OTA\_HotelRateAmountNotifRS</code></p> |
| Hotel not found for HotelCode=XXXXXX    | <p><code>OTA\_HotelAvailRS</code></p><p><code>OTA\_HotelAvailNotifRS</code></p><p><code>OTA\_HotelRateAmountNotifRS</code></p> |
| Room type code not found for this hotel | <p><code>OTA\_HotelAvailNotifRS</code></p><p><code>OTA\_HotelRateAmountNotifRS</code></p>                                      |
| Rate code not found for this hotel      | <p><code>OTA\_HotelAvailNotifRS</code></p><p><code>OTA\_HotelRateAmountNotifRS</code></p>                                      |

#### **Invalid included occupancy** <a href="#invalid-included-occupancy" id="invalid-included-occupancy"></a>

{% code title="Required for PDP" %}

```xml
<OTA_HotelRateAmountNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="12" Code="137">Invalid included occupancy</Error>
	</Errors>
</OTA_HotelRateAmountNotifRS>
```

{% endcode %}

{% hint style="info" %}
**Optional:** the error `Invalid included occupancy` can be combined with `expecting N` (e.g. `Invalid included occupancy: expecting 2`). This provides more detailed information about the correct value that need to be configured in the room rate mapping.
{% endhint %}

#### **Invalid number of adults**

This error will validate against the # of `BaseByGuestAmt` nodes received in the `OTA_HotelRateAmountNotifRQ`. If you have set the Max Occupancy to 5, then you must expect **5** `BaseByGuestAmt` indicating the price per pax. If you receive **more** or **less,** then the error `Invalid number of adults` must be sent to alert the hotelier to check the Max Occupancy setting in SiteMinder. `BaseByGuestAmt` nodes must match the Max Occupancy value for that room rate combo.

{% code title="Required for OBP" %}

```xml
<OTA_HotelRateAmountNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="12" Code="397">Invalid number of adults</Error>
	</Errors>
</OTA_HotelRateAmountNotifRS>
```

{% endcode %}

{% hint style="info" %}
**Optional:** the error `Invalid number of adults` can be combined with `expecting N` (e.g. `Invalid number of adults: expecting 5`). This provides more detailed information about the correct value that need to be configured in the room rate mapping.
{% endhint %}

### Auto-Disable Mechanism

To ensure data accuracy and system integrity, our error handling includes an auto-disabling mechanism that temporarily disconnects a property or specific rooms and rates when certain errors are returned after pushing availability, restriction, or rate updates.

For instance, if an error like `Hotel not found for HotelCode` is detected in your [OTA\_HotelAvailNotifRS](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/availability-and-restrictions#response) or [OTA\_HotelRateAmountNotifRS](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/rates#response), the entire property connection is disabled. In cases where errors such as `Room type code not found for this hotel`, `Rate code not found for this hotel`, `Invalid included occupancy`, or `Invalid number of adults` occur, only the affected rooms or rates are disabled.

Once disabled, the system stops retrying the connection indefinitely and sends an email notification to the property with details about the action taken, the error encountered, and steps for resolution. Inform us If your booking channel requires additional error responses to trigger this mechanism

{% hint style="success" %}
This mechanism relies on the error descriptions to function correctly. Ensure that the descriptions used match those listed above. Error messages are case-sensitive.
{% endhint %}

## Responses from SiteMinder <a href="#error-responses-from-siteconnect" id="error-responses-from-siteconnect"></a>

Your system should have a strong error handling process that can queue and resend reservation requests.

Ensure that your system waits for a response from SiteMinder before sending additional reservation requests for the same site. Set an appropriate timeout duration, **between 60 and 120 seconds**, to allow requests to complete before retrying. This prevents unnecessary retries and ensures smooth communication.

If the response contains an OTA message with an **'Error'** element, then the reservation cannot be processed because some data is invalid. See below [Common Error Responses](#common-error-responses). The reservation request message will not process until the **error** is fixed.\
In this case, do not retry sending the reservation request until the issue in the payload is fixed. Remove the request from the queue.

### Sample Error Response

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="8c836193-ef3d-43b9-835a-19f8ffa7282a" TimeStamp="2023-04-28T10:35:29+00:00" Version="1.0">
			<Errors>
				<Error Type="10">Node CreateDateTime must exist</Error>
			</Errors>
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

### Common Error Responses

{% tabs %}
{% tab title="Credentials" %}

<pre class="language-xml"><code class="lang-xml">&#x3C;OTA_HotelResNotifRS
<strong>	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
</strong>	&#x3C;Errors>
		&#x3C;Error Type="4">Invalid Username and/or Password for ABC&#x3C;/Error>
	&#x3C;/Errors>
&#x3C;/OTA_HotelResNotifRS>
</code></pre>

Check that the correct username/password is sent in the request.
{% endtab %}

{% tab title="Incorrect Hotel Code" %}

```xml
<OTA_HotelResNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="6">Hotel not found for HotelCode=XXXXXX</Error>
	</Errors>
</OTA_HotelResNotifRS>
```

1. Contact the hotel to make sure they have the correct hotel code configured in SiteMinder.
2. In some cases, you will receive this error if using the incorrect region reservation endpoint. Please review **Region-Dependent Reservation Delivery** under [API Reference](/siteconnect-api/guides/api-overview#reservations).
   {% endtab %}

{% tab title="No Hotel Code" %}

```xml
<OTA_HotelResNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="6">No HotelCodes were found in the message payload. Authorisation cannot proceed.</Error>
	</Errors>
</OTA_HotelResNotifRS>
```

Check your reservation request. `<BasicPropertyInfo HotelCode="HOTELCODE" HotelName="The Hotel Name"/>` must be present.
{% endtab %}

{% tab title="Node Must Exist" %}

```xml
<OTA_HotelResNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="9a40291f-24fa-410d-b1c2-b64efab47da4" TimeStamp="2023-04-28T20:46:53+10:00" Version="1.0">
	<Errors>
		<Error Type="10">Node CreateDateTime must exist</Error>
	</Errors>
</OTA_HotelResNotifRS>
```

Your reservation request must be adjusted to send the required data.\
This applies to any other required element or attributes that are missing in the XML.
{% endtab %}
{% endtabs %}

### HTTP Error Handling

#### 4xx – Client Errors

4xx errors indicate that the request sent to SiteMinder is invalid. **These errors should not be retried, as resending the same message will continue to fail**. The partner must correct the payload, structure, or authentication details before attempting to send the request again. For a complete list of common 4xx errors and how to address them, refer to the [HTTP Error Handling](/siteconnect-api/additional-resources/reference-tables/http-error-handling) page.

#### 5xx – Server Errors

5xx errors indicate a temporary issue on the server or an upstream dependency. **These errors are usually recoverable, and partners are expected to implement a retry strategy**. We recommend an exponential backoff approach (5s → 10s → 20s → 40s → then every 1 minute) until a minimum timeout of 30 minutes is reached. If delivery still fails after the retry period, please contact SiteMinder’s Application Operations team. More information on common 5xx responses is available in the [HTTP Error Handling](/siteconnect-api/additional-resources/reference-tables/http-error-handling) page.

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# API Overview

Use this page to understand what each SiteConnect API operation does and what data it handles.

### Rooms and Rates <a href="#rooms-and-rates" id="rooms-and-rates"></a>

***

`SOAP/XML`

Retrieve room type and rate plan configurations from your booking channel to map with the SiteMinder Platform.

View API Specification [→](/siteconnect-api/reference/rooms-and-rates)

***

### Availability and Restrictions <a href="#availability-and-restrictions" id="availability-and-restrictions"></a>

***

`SOAP/XML`

Sync room inventory and booking restrictions from SiteMinder Platform to your booking channel.

* Availability
* Stop Sell
* Minimum Stay on Arrival
* Maximum Stay on Arrival
* Minimum Stay Through
* Maximum Stay Through
* Close to Arrival (CTA)
* Close to Departure (CTD)

View API Specification [→](/siteconnect-api/reference/availability-and-restrictions)

***

### Rates

***

`SOAP/XML`

Sync pricing from SiteMinder Platform to your booking channel.

* Per Day Pricing (PDP)
* Occupancy Based Pricing (OBP)

View API Specification [→](/siteconnect-api/reference/rates)

***

### Reservations

***

`SOAP/XML`

Push reservations messages to SiteMinder Platform in real-time.

* Reservation (Initial Delivery)
* Reservation Multi-Rooms
* Reservation Modifications
* Reservation Cancellations

View API Specification [→](/siteconnect-api/reference/reservations)

{% hint style="warning" %}
**Reservation Notification Emails:** SiteMinder can optionally send reservation notification emails to hotels based on key data provided in the `OTA_HotelResNotifRQ`. If your channel cannot send reservation emails directly to hotels, notify the Integration Analyst during the SiteMinder development process. This feature is not enabled by default and must be requested for activation.
{% endhint %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Rooms and Rates

Retrieve room type and rate plan configurations from your booking channel to map room rate configuration with the SiteMinder Platform.

{% hint style="info" %}
**API:** SiteConnect · **Operation:** Rooms and Rates · **Direction:** Channel → SM · **Method:** Pull (SM-initiated)
{% endhint %}

## What is Rooms and Rates?

**Rooms and Rates** is a PULL-based retrieval method where SiteMinder initiates requests to your booking channel endpoint to retrieve a list of configured room types and rate plans. Your channel hosts the endpoint and responds with your current inventory configuration. This ensures that the property can properly map its internal room and rate structures with the configurations set up on the channel side, maintaining accurate inventory, pricing and reservation synchronization.

#### Considerations

**Active Rooms Only:** The `OTA_HotelAvailRS` response must include only room types and rate plans that are currently active and available for booking in your channel. This ensures that hoteliers can effectively manage these rooms within the SiteMinder Platform.

**Include only:**

* Room types and rate plans that are currently active in your channel
* Inventory that is available for booking
* Configurations the hotel can actually manage in your system

**Do not include:**

* Inactive or archived room types
* Disabled rate plans
* Test or development configurations
* Expired or future-dated inventory

**Update Frequency:** SiteMinder calls this endpoint on-demand when hotels access the room rate mapping interface during initial property setup and when configuration updates are needed. Your booking channel must keep this endpoint operational as SiteMinder will request updates when necessary. **Performance expectation:** Your endpoint should respond within 1-2 seconds as hotels are actively waiting for the mapping interface to load.

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>The booking channel will provide a single global endpoint for all hotels to receive <code>OTA_HotelAvailRQ</code> requests from SiteMinder and respond with <code>OTA_HotelAvailRS</code> messages indicating success or failure.</li><li>The endpoint must use a registered domain name.</li><li>Direct IP addresses are not supported and cannot be used as endpoints.</li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>The booking channel will provide a single username/password for all hotels.</li><li>SiteMinder will include authentication credentials within the <strong>SOAP Security header</strong> of each <code>OTA_HotelAvailRQ</code>.</li><li>Credentials must follow a strong password policy: minimum of 12 characters, including a mix of uppercase and lowercase letters, numbers, and at least one special character (e.g., <code>!</code> <code>@</code> <code>#</code> <code>?</code> <code>]</code>).</li><li>Do not use <code>&#x3C;</code> <code>></code> <code>&#x26;</code> <code>"</code> <code>'</code> as they can cause issues with the Web Service.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses must be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li><li>SiteMinder sends requests over <strong>port 443</strong>.</li></ul></td></tr><tr><td><strong>IP Whitelisting</strong></td><td><p><strong>Pre-Production IP addresses:</strong><br></p><p><code>52.13.134.140</code></p><p><code>34.213.128.113</code></p><p><code>35.164.250.223</code><br><br><strong>Production IP addresses will be provided during go-live.</strong></p></td></tr></tbody></table>

## Message Exchange Flow

When SiteMinder needs to retrieve the room type and rate plan configuration for a property, it sends a request to your booking channel using a synchronous SOAP/HTTPS exchange. This configuration retrieval allows the property to map on SiteMinder Platform its inventory structure for accurate distribution and reservation management.

1. **Configuration Request (SiteMinder to booking channel)**: `OTA_HotelAvailRQ`\
   Requests the complete list of active room types and rate plans for a specific hotel.
2. **Configuration Response (booking channel to SiteMinder)**: `OTA_HotelAvailRS`\
   Returns the complete room and rate configuration for the requested property.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from SiteMinder to your booking channel endpoint. It contains the username and password credentials that you provide to the SiteMinder during integration setup.

**Key Requirements:**

* **Validation**: Your endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Configuration Request" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelAvailRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0" AvailRatesOnly="true">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelAvailRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Configuration Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Success/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelAvailRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Configuration Request**

This endpoint retrieves the active room and rate configuration for a single property. Each `HotelCode` represents a unique property in your channel, and the response should reflect that property's current inventory structure.

```xml
<OTA_HotelAvailRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0" AvailRatesOnly="true">
	<AvailRequestSegments>
		<AvailRequestSegment AvailReqType="Room">
			<HotelSearchCriteria>
				<Criterion>
					<HotelRef HotelCode="HOTELCODE"/>
				</Criterion>
			</HotelSearchCriteria>
		</AvailRequestSegment>
	</AvailRequestSegments>
</OTA_HotelAvailRQ>
```

<table data-full-width="false"><thead><tr><th width="248">Element / @Attribute</th><th width="105">Type</th><th width="40" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailRQ</code></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>@AvailRatesOnly</code></td><td>Boolean</td><td align="center">1</td><td>Indicates that only availability rates should be returned. Will be set to <code>true</code>.</td></tr><tr><td><code>AvailRequestSegments</code></td><td>Element</td><td align="center">1</td><td>Container for availability request segments.</td></tr><tr><td><code>AvailRequestSegment</code></td><td>Element</td><td align="center">1</td><td>Single availability request segment.</td></tr><tr><td><code>@AvailReqType</code></td><td>String</td><td align="center">1</td><td>Specifies the type of availability request. Will be set to <code>Room</code>.</td></tr><tr><td><code>HotelSearchCriteria</code></td><td>Element</td><td align="center">1</td><td>Container for the hotel search criteria.</td></tr><tr><td><code>Criterion</code></td><td>Element</td><td align="center">1</td><td>Single search criterion.</td></tr><tr><td><code>HotelRef</code></td><td>Element</td><td align="center">1</td><td>Reference to a specific hotel.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr></tbody></table>

## 2. Configuration Response

**Active Rooms Only:** The OTA\_HotelAvailRS response must include only room types and rate plans that are currently active and available for booking in your channel. This ensures that hoteliers can effectively manage these rooms within the SiteMinder Platform.

**Unique Identifiers:** Each room type must have a unique `RoomTypeCode` and `RoomDescription @Name`. Each rate plan must have a unique `RatePlanCode` and `RatePlanDescription @Name`. Each room-rate combination must be unique to ensure accurate mapping.

**Clear Descriptions:** The `RoomDescription @Name` and `RatePlanDescription @Name` appear in dropdown menus within the SiteMinder Platform's mapping interface. Use clear, concise descriptions that enable hoteliers to easily identify and map their room types and rate plans to your channel's inventory.

**Occupancy Based Pricing (OBP):** SiteConnect supports both Per Day Pricing (PDP) and Occupancy Based Pricing (OBP). For PDP, no occupancy information is required. For OBP, you must include the `Occupancy` element with `MaxOccupancy` attribute, which defines how many occupancy-based rates SiteMinder will send in `OTA_HotelRateAmountNotifRQ` messages.

**MaxOccupancy values:**

* Valid range: 1 to 50
* Example: If `MaxOccupancy="3"`, SiteMinder will send rates for 1 person, 2 persons, and 3 persons
* Your channel must be able to receive and process all occupancy variations you specify

{% hint style="warning" %}
**Migration consideration:** When migrating from PDP to OBP, you must provide `MaxOccupancy` for each room-rate combination in your `OTA_HotelAvailRS` response.
{% endhint %}

{% tabs %}
{% tab title="Success" %}

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="Success Multi. Rates" %}

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="DBL">
					<RoomDescription Name="Double Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BNB">
					<RatePlanDescription Name="Bed & Breakfast">
						<Text>Bed & Breakfast Rate.</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="Success for OBP" %}

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
					<Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Errors>
		<Error Type="6" Code="392">Hotel not found for HotelCode=XXXXXX</Error>
	</Errors>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="Invalid Responses" %}
**This is an invalid response.** Each `<RoomType>` and `<RatePlan>` combination must be in its own `RoomStay`. Multiple `<RatePlans>` cannot be sent under the same `RoomStay`.

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
			<RatePlans>
				<RatePlan RatePlanCode="NR">
					<RatePlanDescription Name="Non Refundable Rate">
						<Text>Non Refundable Rate.</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

**This is an invalid response.** `RoomDescription @Name` and `RatePlanDescription @Name` fields must be unique for each room rate combination otherwise SiteMinder will consider as duplicate mappings.

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Standard Rate">
						<Text>Standard Rate</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="NR">
					<RatePlanDescription Name="Standard Rate">
						<Text>Standard Rate</Text>
					</RatePlanDescription>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

{% endtab %}
{% endtabs %}

### Optional Flags

Use optional flags in your response to control how SiteMinder sends updates for specific room-rate combinations:

* `NO_UPDATES`**:** Room-rate is mapped for reservation delivery only; no availability, rates, or restriction updates will be sent. Use this when a room-rate combination should appear in mapping for reservation delivery only but not receive any inventory updates from SiteMinder. The booking channel will manage this inventory entirely on their side.
* `NO_AVAILABILITY`**:** Prevents SiteMinder from sending availability updates for this room-rate combination. Restrictions and rates will still be sent.
* `NO_RATES`**:** Prevents SiteMinder from sending rate updates for this room-rate combination. Availability and restrictions will still be sent.

**Combined flags:** You can use `NO_AVAILABILITY` and `NO_RATES` together to allow only restriction updates for specific room-rate combinations.

{% hint style="success" %}
Even when `NO_AVAILABILITY` flag is set, restriction updates (stop sells, min/max stay, CTA/CTD) will still be sent in the `OTA_HotelAvailNotifRQ`.
{% endhint %}

**Example use case for `NO_UPDATES`:** Special contracted rates that the hotel manages directly in your channel but wants reservations sent to their PMS.

{% tabs %}
{% tab title="NO\_UPDATES" %}
Block all updates (availability, restrictions and rates).

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
					<Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
					<AdditionalDetails>
						<AdditionalDetail Code="NO_UPDATES"/>
					</AdditionalDetails>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="NO\_AVAILABILITY" %}
Block availability updates, allowing restrictions and rate updates.

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
					<Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
					<AdditionalDetails>
						<AdditionalDetail Code="NO_AVAILABILITY"/>
					</AdditionalDetails>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>Block availability updates
```

{% endtab %}

{% tab title="NO\_RATES" %}
Block rate updates, allowing availability and restrictions updates.

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
					<Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
					<AdditionalDetails>
						<AdditionalDetail Code="NO_RATES"/>
					</AdditionalDetails>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

{% endtab %}

{% tab title="Combined" %}
Block availability and rates updates, allowing restrictions updates.

```xml
<OTA_HotelAvailRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<RoomStays>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
					<Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="BAR">
					<RatePlanDescription Name="Best Available Rate">
						<Text>Best Available Rate.</Text>
					</RatePlanDescription>
					<AdditionalDetails>
						<AdditionalDetail Code="NO_RATES"/>
						<AdditionalDetail Code="NO_AVAILABILITY"/>
					</AdditionalDetails>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<RoomStay>
			<RoomTypes>
				<RoomType RoomTypeCode="SGL">
					<RoomDescription Name="Single Room">
						<Text>Single bed for single occupancy.</Text>
					</RoomDescription>
					<Occupancy AgeQualifyingCode="10" MaxOccupancy="2"/>
				</RoomType>
			</RoomTypes>
			<RatePlans>
				<RatePlan RatePlanCode="NR">
					<RatePlanDescription Name="Non-Refundable">
						<Text>Non-Refundable.</Text>
					</RatePlanDescription>
					<AdditionalDetails>
						<AdditionalDetail Code="NO_UPDATES"/>
					</AdditionalDetails>
				</RatePlan>
			</RatePlans>
		</RoomStay>
		<!-- Additional RoomStay elements -->
	</RoomStays>
</OTA_HotelAvailRS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="239">Element / @Attribute</th><th width="108">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the response. Must be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier matching the request <code>EchoToken</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>RoomStays</code></td><td>Element</td><td align="center">0..1</td><td>Container for room stay information.</td></tr><tr><td><code>RoomStay</code></td><td>Element</td><td align="center">1..n</td><td>Single room stay information.</td></tr><tr><td><code>RoomTypes</code></td><td>Element</td><td align="center">1</td><td>Container for room types.</td></tr><tr><td><code>RoomType</code></td><td>Element</td><td align="center">1</td><td>Single room type information.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">1</td><td>Code for the room type.</td></tr><tr><td><code>RoomDescription</code></td><td>Element</td><td align="center">1</td><td>Description of the room.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">1</td><td>Name of the room.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">0..1</td><td>Description text for the room.</td></tr><tr><td><code>Occupancy</code></td><td>Element</td><td align="center">0..1</td><td>Occupancy details for the room. <strong>Only for OBP</strong>.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">1</td><td><p>Age qualification code for the occupancy:</p><p><code>10</code> Adult</p><p><strong>Only for OBP</strong>.</p></td></tr><tr><td><code>@MaxOccupancy</code></td><td>Integer</td><td align="center">1</td><td><p>Maximum occupancy for the room.</p><p>Min <code>1</code> - Max <code>50</code></p><p><strong>Only for OBP</strong>.</p></td></tr><tr><td><code>RatePlans</code></td><td>Element</td><td align="center">0..1</td><td>Container for rate plans.</td></tr><tr><td><code>RatePlan</code></td><td>Element</td><td align="center">1</td><td>Single rate plan information.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">1</td><td>Code for the rate plan.</td></tr><tr><td><code>RatePlanDescription</code></td><td>Element</td><td align="center">1</td><td>Description of the rate plan.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">1</td><td>Name of the rate plan.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">0..1</td><td>Description text for the rate plan.</td></tr><tr><td><code>AdditionalDetails</code></td><td>Element</td><td align="center">0..1</td><td>Additional details about the rate plan.</td></tr><tr><td><code>AdditionalDetail</code></td><td>Element</td><td align="center">1..2</td><td>Single additional detail.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">1</td><td><p>Codes:</p><p><code>NO_RATES</code></p><p><code>NO_AVAILABILITY</code></p><p><code>NO_UPDATES</code></p></td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="/pages/eTWh81Gq6djsnm0unSR4">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Common Questions

<details>

<summary>What is the purpose of the Rooms and Rates endpoint?</summary>

The Rooms and Rates endpoint allows SiteMinder to retrieve the complete list of active room types and rate plans configured in your booking channel for a specific property.

**When it's called:**

* During initial property setup
* When the hotel needs to update their room rate mappings
* When SiteMinder needs to refresh configuration data

**What it enables:**

* Hotels can map their SiteMinder room types to your channel's room types
* Establishes the foundation for all ARI updates and reservations
* Ensures accurate inventory synchronization between systems

</details>

<details>

<summary>Can I retrieve rooms and rates from SiteMinder to load into my system?</summary>

No, you cannot directly retrieve rooms and rates from SiteMinder. The workflow is:

1. **Booking channel setup:** Room types and rate plans must first be configured in your channel based on the agreement between the hotel and your booking channel
2. **SiteMinder requests:** SiteConnect sends `OTA_HotelAvailRQ` to retrieve your channel's configuration
3. **Hotel mapping:** The hotel maps your channel's rooms and rates to their SiteMinder inventory structure

**Why this direction?** This ensures that the booking channel controls their own inventory structure and SiteMinder adapts to it.

</details>

<details>

<summary>How often does SiteMinder call the Rooms and Rates endpoint?</summary>

SiteMinder calls this endpoint:

* **On-demand** when hotels access the room rate mapping interface
* **Not on a schedule** - there is no automatic polling
* **During setup** when a new property is being configured

**Performance expectation:** Your endpoint should respond within 1-2 seconds as hotels are actively waiting for the mapping interface to load.

</details>

<details>

<summary>Why aren't all the rooms and rates I sent showing up in the mapping interface?</summary>

This occurs when **combinations are not unique**. Each room rate must have a distinct combination of:

* `RoomDescription @Name` + `RatePlanDescription @Name`

**Example of the problem:**

```xml
<!-- Room Rate 1 -->
<RoomDescription Name="Standard Room"/>
<RatePlanDescription Name="Standard Rate"/>

<!-- Room Rate 2 - DUPLICATE COMBINATION -->
<RoomDescription Name="Standard Room"/>
<RatePlanDescription Name="Standard Rate"/>
```

**Solution:** Ensure each combination is unique by:

* Using specific rate plan names (e.g., "Standard Rate - Flexible", "Standard Rate - Non-Refundable")
* Making room descriptions more specific (e.g., "Standard Room - City View", "Standard Room - Garden View")

</details>

<details>

<summary>Why can't I find the <code>RoomDescription/Text</code> we sent in the SiteMinder platform?</summary>

The `RoomDescription/Text` element is used **internally by SiteMinder Support** and is not displayed in the hotel-facing mapping interface.

**What hotels see:**

* `RoomDescription @Name` - Appears in dropdown menus
* `RatePlanDescription @Name` - Appears in dropdown menus

**Best practice:** Make the `@Name` attributes clear and descriptive since these are what hotels will use for mapping.

</details>

<details>

<summary>What are the NO_UPDATES, NO_AVAILABILITY, and NO_RATES flags?</summary>

These optional flags control which types of updates SiteMinder sends for specific room-rate combinations:

**NO\_UPDATES:**

* Blocks **all** ARI updates (availability, restrictions, and rates)
* Use for room rates that are mapped **only for reservation delivery**

**NO\_AVAILABILITY:**

* Blocks **availability** updates only
* Restrictions and rates will still be sent
* **Note:** Restriction updates (stop sells, min/max stay, CTA/CTD) will still be sent in `OTA_HotelAvailNotifRQ`

**NO\_RATES:**

* Blocks **rate** updates only
* Availability and restrictions will still be sent

**Combined flags:** You can use `NO_AVAILABILITY` and `NO_RATES` together to allow only restriction updates.

</details>

<details>

<summary>Does my channel need to support Occupancy Based Pricing (OBP)?</summary>

SiteConnect supports both **Per Day Pricing (PDP)** and **Occupancy Based Pricing (OBP)**.

**PDP (default):**

* Single rate per room per night
* No occupancy variations required
* No `Occupancy` element needed in response

**OBP (optional):**

* Different rates based on number of guests
* Requires `Occupancy` element with `MaxOccupancy` attribute
* More flexible pricing structure

You can support either or both pricing models based on your channel's capabilities.

</details>

<details>

<summary>We only supported RoomTypeCode, but now we want to add RatePlanCode. What do we need to do?</summary>

Adding `RatePlanCode` support requires completing a certification process:

**Steps:**

1. **Development:** Modify your system to include `RatePlanCode` in responses
2. **Certification:** Complete testing with SiteMinder Partner Integrations team
3. **Hotel remapping:** Properties will need to remap their room rates to include the new `RatePlanCode`

**Impact:** This is a significant change that affects all connected properties but provides better granularity for rate plan management.

</details>

<details>

<summary>What happens if I change the room name or rate plan name?</summary>

Changing `RoomDescription @Name` or `RatePlanDescription @Name` **without changing the codes**:

**Impact:**

* Connection remains intact (codes unchanged)
* Hotels must **re-save** their mapping in SiteMinder platform to see updated descriptions
* If hotels don't re-save, they'll see old descriptions but functionality continues

**Best practice:** Notify connected hotels when you change descriptions so they can update their mappings if needed.

</details>

<details>

<summary>What happens if I change the RoomTypeCode or RatePlanCode?</summary>

Changing `RoomTypeCode` or `RatePlanCode` **breaks the existing mapping**:

**Impact:**

* SiteMinder will not recognize the old codes
* All ARI updates for this room-rate combination will fail
* Reservations may not be properly routed
* Hotels must **complete the mapping again** from scratch

**Critical:** Code changes should be avoided whenever possible. If absolutely necessary:

1. Notify SiteMinder Partner Integrations team in advance
2. Coordinate with affected hotels
3. Plan for a maintenance window
4. Provide clear migration instructions

</details>

<details>

<summary>What are the most common validation errors for Rooms and Rates?</summary>

**Common errors:**

1. **Multiple rate plans in single RoomStay**
   * Each `RoomType` + `RatePlan` combination must be in its own `RoomStay`
   * Invalid: Multiple `<RatePlans>` elements under one `<RoomStay>`
2. **Non-unique combinations**
   * `RoomDescription @Name` + `RatePlanDescription @Name` must be unique
   * SiteMinder displays only one instance when duplicates exist
3. **Missing required fields**
   * `RoomTypeCode`, `RoomDescription @Name`, `RatePlanCode`, `RatePlanDescription @Name` are all mandatory
4. **Invalid MaxOccupancy for OBP**
   * Must be between 1 and 50
   * Required when supporting OBP

**Testing:** Use the "Invalid Responses" examples in the specification to verify your validation logic.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Availability and Restrictions

Sync room inventory and booking restrictions from SiteMinder Platform to your booking channel.

{% hint style="info" %}
**API:** SiteConnect · **Operation:** Availability and Restrictions · **Direction:** SM → Channel
{% endhint %}

## What is Availability and Restrictions?

**Availability and Restrictions** is an update method where the SiteMinder Platform actively sends room inventory counts and booking restrictions to the booking channel. This integration ensures that the booking channel receive synchronized availability and restriction updates in real-time, preventing overbookings and maintaining accurate inventory control.

The API handles two primary data types:

* **Availability Updates**: Real-time room inventory counts that define how many rooms are available for sale on specific dates.
* **Restriction Updates**: Booking rules and limitations including stop sells, closed to arrival/departure, and minimum/maximum length of stay requirements.

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>The booking channel will provide a single global endpoint for all hotels for SiteMinder to push <code>OTA_HotelAvailNotifRQ</code> messages and receive <code>OTA_HotelAvailNotifRS</code> responses indicating success or failure.</li><li>The endpoint must use a registered domain name.</li><li>Direct IP addresses are not supported and cannot be used as endpoints.</li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>The booking channel will provide a single username/password for all hotels.</li><li>SiteMinder will include authentication credentials within the <strong>SOAP Security header</strong> of each <code>OTA_HotelAvailNotifRQ</code>.</li><li>Credentials must follow a strong password policy: minimum of 12 characters, including a mix of uppercase and lowercase letters, numbers, and at least one special character (e.g., <code>!</code> <code>@</code> <code>#</code> <code>?</code> <code>]</code>).</li><li>Do not use <code>&#x3C;</code> <code>></code> <code>&#x26;</code> <code>"</code> <code>'</code> as they can cause issues with the Web Service.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses must be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li><li>SiteMinder sends requests over <strong>port 443</strong>.</li></ul></td></tr><tr><td><strong>IP Whitelisting</strong></td><td><p><strong>Pre-Production IP addresses:</strong><br></p><p><code>52.13.134.140</code></p><p><code>34.213.128.113</code></p><p><code>35.164.250.223</code><br><br><strong>Production IP addresses will be provided during go-live.</strong></p></td></tr></tbody></table>

## Message Exchange Flow

When SiteMinder needs to update room availability or booking restrictions, it sends updates to your booking channels using a synchronous SOAP/HTTPS exchange. Each update triggers a simple request-response cycle.

1. **Availability and Restrictions Update (SiteMinder to booking channel)**: `OTA_HotelAvailNotifRQ`\
   Delivers availability counts and/or booking restrictions (stop sells, CTA, CTD, min/max stay) for specific room types and rate plans across defined date ranges.
2. **Confirmation Response (booking channel to SiteMinder)**: `OTA_HotelAvailNotifRS`\
   Confirms successful receipt and processing or reports validation errors.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from SiteMinder to your booking channel endpoint. It contains the username and password credentials that you provide to the SiteMinder during integration setup.

**Key Requirements:**

* **Validation**: Your endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% tabs %}
{% tab title="Availability and Restrictions Update" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelAvailNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelAvailNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Success/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelAvailNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Availability and Restrictions Update**

Each Availability and Restrictions message contains a single `AvailStatusMessages` element which indicates the hotel to update using the `AvailStatusMessages` / `HotelCode` attribute. The `AvailStatusMessages` / `AvailStatusMessage` elements will contain the updates to process over a date range. There can be several `AvailStatusMessage` updates per request; however, each request will be limited to one hotel and one room type.

#### **Key Concepts**

**Response Behaviour for Stop Sells:** If the partner's system does not support stop sells, it is required that the system interpret a RestrictionStatus of "Close" as equivalent to zero availability. This ensures consistency in how availability is communicated between SiteMinder and the booking channel, preventing errors when managing inventory. This behaviour is allowed only if the booking channel supports one rate plan per room type.

**Minimum Stay and Maximum Stay:** Can be defined as either:

* **"Stay on Arrival"** (based on the arrival date): `SetMinLOS` or `SetMaxLOS`
* **"Stay Through"** (covering the entire stay): `SetForwardMinStay` or `SetForwardMaxStay`

The Min/Max Stay Through option is managed at the property level. Once certified, each property can choose their preferred setting.

{% hint style="success" %}
To enable Min/Max Stay Through, the booking channel must also support Min/Max Stay On Arrival.
{% endhint %}

{% tabs %}
{% tab title="Stay on Arrival" %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage BookingLimit="10"> <!-- Availability -->
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<RestrictionStatus Status="Open"/> <!-- Stop Sell -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<LengthsOfStay>
				<LengthOfStay MinMaxMessageType="SetMinLOS" Time="1"/> <!-- Min Length of Stay -->
				<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="3"/> <!-- Max Length of Stay -->
			</LengthsOfStay>
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<RestrictionStatus Restriction="Arrival" Status="Open"/> <!-- Close to Arrival (CTA) -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<RestrictionStatus Restriction="Departure" Status="Open"/> <!-- Close to Departure (CTD) -->
		</AvailStatusMessage>
		<!-- Additional AvailStatusMessage elements -->
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endtab %}

{% tab title="Stay Through" %}

```xml
<OTA_HotelAvailNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<AvailStatusMessages HotelCode="HOTELCODE">
		<AvailStatusMessage BookingLimit="10"> <!-- Availability -->
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<RestrictionStatus Status="Open"/> <!-- Stop Sell -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<LengthsOfStay>
				<LengthOfStay MinMaxMessageType="SetForwardMinStay" Time="1"/> <!-- Min Length of Stay -->
				<LengthOfStay MinMaxMessageType="SetForwardMaxStay" Time="3"/> <!-- Max Length of Stay -->
			</LengthsOfStay>
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<RestrictionStatus Restriction="Arrival" Status="Open"/> <!-- Close to Arrival (CTA) -->
		</AvailStatusMessage>
		<AvailStatusMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<RestrictionStatus Restriction="Departure" Status="Open"/> <!-- Close to Departure (CTD) -->
		</AvailStatusMessage>
		<!-- Additional AvailStatusMessage elements -->
	</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="285">Element / @Attribute</th><th width="108">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailNotifRQ</code></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>AvailStatusMessages</code></td><td>Element</td><td align="center">1</td><td>Container for availability status messages.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>AvailStatusMessage</code></td><td>Element</td><td align="center">1</td><td>Single availability status message.</td></tr><tr><td><code>@BookingLimit</code></td><td>Integer</td><td align="center">1</td><td>Sets the number of rooms available for sale.</td></tr><tr><td><code>StatusApplicationControl</code></td><td>Element</td><td align="center">1</td><td>Contains date and room identification information.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>The start date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>The end date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@InvTypeCode</code></td><td>String</td><td align="center">1</td><td>Identifies the room.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">1</td><td>Identifies the rate.</td></tr><tr><td><code>LengthsOfStay</code></td><td>Element</td><td align="center">0..2</td><td>Used for Minimum Stay and Maximum Stay.</td></tr><tr><td><code>LengthOfStay</code></td><td>Element</td><td align="center">1</td><td>Single length of stay information.</td></tr><tr><td><code>@MinMaxMessageType</code></td><td>String</td><td align="center">1</td><td><p>Can be one of the following:</p><p><code>SetMinLOS</code></p><p><code>SetMaxLOS</code></p><p><code>SetForwardMinStay</code></p><p><code>SetForwardMaxStay</code></p></td></tr><tr><td><code>@Time</code></td><td>Integer</td><td align="center">0..1</td><td>Specifies the number of days related to a stay. Valid range: 1 to 9999.<br><br><strong>Minimum Stay:</strong> Always included with minimum value of 1.<br><br><strong>Maximum Stay:</strong> When <strong>included</strong>: Set or update the maximum stay value. When <strong>excluded</strong>: Remove/clear any existing maximum stay restriction.</td></tr><tr><td><code>RestrictionStatus</code></td><td>Element</td><td align="center">0..1</td><td>Used to restrict the room for Stop Sell, Closed to Arrivals, and Closed to Departure.</td></tr><tr><td><code>@Status</code></td><td>String</td><td align="center">1</td><td><p>Values:</p><p><code>Open</code> (opens room for sale)</p><p><code>Close</code> (closes room for sale)</p></td></tr><tr><td><code>@Restriction</code></td><td>String</td><td align="center">0..1</td><td><p>Values:</p><p><code>Arrival</code> (closes to arrival)</p><p><code>Departure</code> (closes to departure)</p><p>If no type is specified, assume a full close or open for the room date.</p></td></tr></tbody></table>

## 2. **Confirmation Response**

{% tabs %}
{% tab title="Success" %}

```xml
<OTA_HotelAvailNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
</OTA_HotelAvailNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelAvailNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Errors>
		<Error Type="6" Code="392">Hotel not found for HotelCode=HOTELCODE</Error>
	</Errors>
</OTA_HotelAvailNotifRS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="259">Element / @Attribute</th><th width="108">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelAvailNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="/pages/eTWh81Gq6djsnm0unSR4">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Common Questions

<details>

<summary>What updates can be sent in a single message?</summary>

Each `OTA_HotelAvailNotifRQ` message is limited to:

* **One hotel** (`HotelCode`)
* **One room type** (`InvTypeCode`)
* **Multiple rate plans** under that room type
* **Multiple date ranges**

Within these constraints, a single message can contain multiple `AvailStatusMessage` elements updating:

* Availability counts (`BookingLimit`)
* Stop Sell status
* Minimum/Maximum Length of Stay
* Close to Arrival (CTA)
* Close to Departure (CTD)

**Example:** You might receive availability, stop sell, and min stay updates for the same room type across different date ranges in one message.

</details>

<details>

<summary>How often will I receive availability and restriction updates?</summary>

**Update Frequency:**

* New update rounds sent every **2 minutes**
* Only changed values for specific room/rate/date combinations are sent
* When a change is triggered, **all** availability and restriction values for that combination are included

**Update Volume:**

* Maximum payload: **210 days** (30 date elements × 7-day spans)
* Response speed affects update frequency - faster responses enable more frequent updates
* First-time connections receive full inventory data for the configured update period

**Important:** Your endpoint must respond within the 20-second timeout, with 1-2 seconds being optimal.

</details>

<details>

<summary>What's the difference between <strong>Room Type level</strong> and Rate Plan level availability?</summary>

**Room Type Level (default):**

* Availability is **shared across all rate plans** for a room type
* Same inventory count applies to all rates (BAR, Non-Refundable, etc.)
* When one rate plan is booked, availability for **all rate plans** under that room type is reduced
* Your system uses `InvTypeCode` as the primary identifier

**Rate Plan Level:**

* **Separate availability** per rate plan under the same room type
* Each rate (BAR, Non-Refundable, etc.) has its own inventory count
* Booking one rate plan only affects that specific rate's availability
* Hotels must configure this setting in SiteMinder Platform
* Your system must use both `InvTypeCode` and `RatePlanCode` to track inventory

**Implementation:** If you only support Room Type level, use `InvTypeCode` and disregard `RatePlanCode` values. If you support Rate Plan level, track inventory separately using the combination of `InvTypeCode` + `RatePlanCode`.

</details>

<details>

<summary>Is there a mechanism to prevent hotels from entering excessively large availability numbers?</summary>

No, SiteConnect does not validate availability amounts. It is the **hotel's responsibility** to enter correct inventory counts.

**Your system must:**

* Accept any positive integer value for `BookingLimit`
* Not impose arbitrary limits on availability counts
* Process updates as received from SiteMinder

**Why no validation?** Some properties have very large inventories (e.g., major hotels, apartment complexes), and SiteMinder cannot determine what constitutes a "reasonable" number for each property.

</details>

<details>

<summary>How should I handle stop sells if my system doesn't support them as a separate feature?</summary>

If your booking channel does not support stop sells as a distinct feature, you **must interpret** `RestrictionStatus @Status="Close"` (without `@Restriction` attribute) as **equivalent to zero availability**.

**Implementation:**

* When you receive `<RestrictionStatus Status="Close"/>`, set availability to 0
* When you receive `<RestrictionStatus Status="Open"/>`, restore previous availability or await new availability update

**Important limitation:** This behavior is **only allowed** if your booking channel supports **one rate plan per room type**. If you support multiple rate plans per room type, you must implement proper stop sell functionality.

**Why?** This ensures consistent inventory management and prevents overbookings when hotels close rooms for sale.

</details>

<details>

<summary>What's the difference between Stay on Arrival and Stay Through?</summary>

**Stay on Arrival (SetMinLOS / SetMaxLOS):**

* Restriction applies **based on the arrival date**
* Guest must stay minimum/maximum nights **starting from** their check-in date
* Example: Min Stay = 3 on Friday means guests arriving Friday must stay at least 3 nights

**Stay Through (SetForwardMinStay / SetForwardMaxStay):**

* Restriction applies **to the entire length of stay**
* Guest must stay minimum/maximum nights **covering specific dates**
* Example: Min Stay Through = 3 for Friday-Sunday means any stay covering those dates must be at least 3 nights

**Configuration:**

* Hotels choose their preferred method in SiteMinder Platform
* Your channel must support **both** Stay on Arrival **and** Stay Through to enable the Through option
* If you only support one method, implement Stay on Arrival

**Message Type:** SiteMinder indicates which method is used via the `MinMaxMessageType` attribute.

</details>

<details>

<summary>What happens if I don't support certain restriction types?</summary>

You should implement **all mandatory restriction types**, but if you cannot support optional restrictions:

1. Inform SiteMinder Partner Integrations team during certification to remove those restrictions from your configuration
2. In the meantime, return a **Success** response (do not return errors for unsupported features)
3. Simply ignore those specific `AvailStatusMessage` elements
4. Process other supported updates in the same message

**Important:** Do not fail the entire message if you don't support one restriction type. Process what you can support.

</details>

<details>

<summary>What are the date range limitations for updates?</summary>

**Per Message:**

* Maximum payload: **210 days** of data
* Structured as up to 30 date elements with maximum 7-day spans each
* `Start` and `End` dates are **inclusive**

**Update Period:**

* SiteConnect can send updates up to **750 days** in advance
* Specific update period configured during channel setup (typically 365-750 days)
* New date added daily to maintain rolling window

**Date Format:**

* ISO 8601 date format: `YYYY-MM-DD`
* Dates use hotel's local timezone as configured in SiteMinder
* Example: `Start="2024-10-05"` `End="2024-10-12"`

**Bundling:** Dates with identical values are bundled into ranges. Different values are sent in separate `AvailStatusMessage` elements.

</details>

<details>

<summary>Why can't I reset the MinStay field back to blank in SiteMinder Platform?</summary>

This is **expected API and platform behaviour**, not a limitation:

**Current Behaviour:**

* Once MinStay is set, it cannot be reverted to "no restriction"
* Minimum value is **1 night**
* To effectively remove the restriction, set it to 1

**API Representation:**

* SiteMinder will send `<LengthOfStay MinMaxMessageType="SetMinLOS" Time="1"/>`
* This represents the "lowest" restriction (1-night minimum)
* No message is sent to "clear" the restriction

**Why?** In OTA standards and most channel systems, a minimum stay of 1 night is functionally equivalent to having no minimum stay restriction, since 1 night is the natural minimum for any booking.

**Workaround:** If your channel needs to distinguish between "1 night minimum" and "no restriction," treat `Time="1"` as "no restriction" in your system.

</details>

<details>

<summary>How do I handle MaxStay updates without a Time attribute?</summary>

When you receive a `LengthOfStay` element for Maximum Stay **without** a `Time` attribute, this means the Maximum Stay restriction has been **removed** in SiteMinder.

**With Time attribute:** Set or update the maximum stay value `<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="3"/>` → Set max stay to 3 nights

**Without Time attribute:** Remove/clear any existing maximum stay restriction `<LengthOfStay MinMaxMessageType="SetMaxLOS"/>` → Clear max stay restriction

**Why this happens:** Hotels can remove Maximum Stay restrictions in SiteMinder Platform. When they do, SiteMinder sends the update without the `Time` attribute to instruct your channel to clear the restriction.

**Important:** This behaviour applies to **Maximum Stay only** (both `SetMaxLOS` and `SetForwardMaxStay`). Minimum Stay will always include a `Time` attribute with a minimum value of 1.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Rates

Sync pricing from SiteMinder Platform to your booking channel.

{% hint style="info" %}
**API:** SiteConnect · **Operation:** Rates · **Direction:** SM → Channel
{% endhint %}

## What is Rates?

**Rates** is an update method where the SiteMinder Platform actively sends room pricing information to the booking channel. This integration ensures that the booking channel receive synchronized rate updates in real-time, maintaining accurate pricing and maximizing revenue opportunities.

The API supports two pricing models:

* **Per Day Pricing (PDP)**: Base rates are set for each individual day, allowing different prices on different days. Rate updates specify rates for each date within the defined range, enabling precise daily rate management.
* **Occupancy Based Pricing (OBP)**: Rates vary based on the number of occupants in the room. Rate updates include pricing for various occupancy levels (single, double, triple, etc.), providing detailed pricing based on the number of guests.

{% hint style="warning" %}
**Pricing Model Configuration**: The pricing model (PDP or OBP) is configured at the booking channel level and applies to all properties connected to your integration. You cannot have some properties using Per Day Pricing while others use Occupancy Based Pricing.

**For partners migrating from PDP to OBP**: Your channel must provide the **Maximum Occupancy** for each room and rate code combination via [Rooms and Rates](/siteconnect-api/reference/rooms-and-rates) for all connected properties. This data is required for an initial setup of the Maximum Occupancy values in our system.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>The booking channel will provide a single global endpoint for all hotels for SiteMinder to push <code>OTA_HotelRateAmountNotifRQ</code> messages and receive <code>OTA_HotelRateAmountNotifRS</code> responses indicating success or failure.</li><li>The endpoint must use a registered domain name.</li><li>Direct IP addresses are not supported and cannot be used as endpoints.</li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>The booking channel will provide a single username/password for all hotels.</li><li>SiteMinder will include authentication credentials within the <strong>SOAP Security header</strong> of each <code>OTA_HotelRateAmountNotifRQ</code>.</li><li>Credentials must follow a strong password policy: minimum of 12 characters, including a mix of uppercase and lowercase letters, numbers, and at least one special character (e.g., <code>!</code> <code>@</code> <code>#</code> <code>?</code> <code>]</code>).</li><li>Do not use <code>&#x3C;</code> <code>></code> <code>&#x26;</code> <code>"</code> <code>'</code> as they can cause issues with the Web Service.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses must be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li><li>SiteMinder sends requests over <strong>port 443</strong>.</li></ul></td></tr><tr><td><strong>IP Whitelisting</strong></td><td><p><strong>Pre-Production IP addresses:</strong><br></p><p><code>52.13.134.140</code></p><p><code>34.213.128.113</code></p><p><code>35.164.250.223</code><br><br><strong>Production IP addresses will be provided during go-live.</strong></p></td></tr></tbody></table>

## Message Exchange Flow

When SiteMinder needs to update room pricing, it sends updates to your booking channel using a synchronous SOAP/HTTPS exchange. Each update triggers a simple request-response cycle.

1. **Rates Update (SiteMinder to booking channel)**: `OTA_HotelRateAmountNotifRQ`\
   Delivers rate values for specific room types and rate plans across defined date ranges. Rates can be configured as Per Day Pricing (PDP) with fixed amounts, or Occupancy Based Pricing (OBP) with rates varying by guest count.
2. **Confirmation Response (booking channel to SiteMinder)**: `OTA_HotelRateAmountNotifRS`\
   Confirms successful receipt and processing or reports validation errors.

## Security Header

The Security Header is a mandatory SOAP header that authenticates every request from SiteMinder to your booking channel endpoint. It contains the username and password credentials that you provide to the SiteMinder during integration setup.

**Key Requirements:**

* **Validation**: Your endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% tabs %}
{% tab title="Rates Update" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRQ
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelRateAmountNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Success/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## **1. Rates Update**

Each Rate message contains a single `RateAmountMessages` element which indicates the hotel to update using the `RateAmountMessages` / `HotelCode` attribute. The `RateAmountMessages` / `RateAmountMessage` elements will contain the updates to process over a date range. There can be several `RateAmountMessage` updates per request, however, each request will be limited to one hotel and one room type.

### Per Day Pricing (PDP)

PDP refers to a pricing model where rates are set for each individual day. Under this model, the rate for a room type is determined on a daily basis, allowing for different prices on different days. The rate updates for PDP will specify rates for each date within the defined range, allowing for precise daily rate management. The below functionalities are supported:

* Rates <mark style="color:red;">\*</mark>
* Included Occupancy
* Single Guest Discount
* Extra Adult Rate
* Extra Child Rate
* Inclusions

{% tabs %}
{% tab title="Base Rates" %}
Example of a Rates XML that **does not** support any additional rate features.\
\
Note the absence of the **@NumberOfGuests** attribute. By default, SiteConnect assumes the **Included Occupancy** for incoming rates is set on the Booking Channel side.

**@NumberOfGuests** attribute is **ONLY** present if you're using our **Included Occupancy** and/or **Single Guest Discount** features and the hotel configures the Included Occupancy / Single Guest Discount value(s) within the 'Channel Settings' for your particular channel.

```xml
<OTA_HotelRateAmountNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR"/> <!-- Base Rate -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Included Occupancy" %}
Once **Included Occupancy** is enabled, it will be a mandatory field for the hotelier to fill in while mapping the room. **@NumberOfGuests** attribute will be present indicating the base included occupancy for the rate.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/> <!-- Included Occupancy -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Single Guest Discount" %}
**@NumberOfGuests="1"** stands for a **'Single Guest Discount'** and does NOT represent **'Included Occupancy'**. the below XML only shows that 100 EUR discount is applied for a single guest occupancy, without specifying 'Included Occupancy' for this particular room rate.

The absence of **@NumberOfGuests** in one of BaseByGuestAmt elements indicates that the **'Included Occupancy'** feature is not supported.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/> <!-- Single Guest Discount -->
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR"/> <!-- Base Rate -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Both Included Occ. and Single Gst Dsct" %}
Both fields, **Included Occupancy** and **Single Guest Discount fields** are enabled in SiteMinder for the hotel to add the values during the mapping.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/> <!-- Single Guest Discount -->
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/> <!-- Included Occupancy -->
					</BaseByGuestAmts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="With Additional Guest Amounts" %}
These features can also be supported individually. For instance:

* If your channel supports **Extra Adult Rate only**, the XML would consist of a single AdditionalGuestAmount element containing @AgeQualifyingCode="10" (value for Adult).
* If your channel supports **Extra Child Rate only**, the XML would consist of a single AdditionalGuestAmount element containing @AgeQualifyingCode="8" (value for Child).

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR"/> <!-- Base Rate -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="10" Amount="100" CurrencyCode="EUR"/> <!-- Extra Adult Rate -->
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="All 4 Rate fields combined" %}

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2025-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2025-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2025-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/><!-- Single Guest Discount -->
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/><!-- Included Occupancy -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="10" Amount="100" CurrencyCode="EUR"/> <!-- Extra Adult Rate -->
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}
{% endtabs %}

### Occupancy Based Pricing (OBP)

OBP is a pricing model where rates vary based on the number of occupants in the room. Under this model, the rate changes depending on the number of guests staying in the room. The Rate updates for OBP will include rates for various occupancy levels, providing detailed pricing based on the number of guests. The below functionalities are supported:

* Rates <mark style="color:red;">\*</mark>
* Included Occupancy <mark style="color:red;">\*</mark>
* Maximum Occupancy <mark style="color:red;">\*</mark>
* Single Guest Discount \*
* Extra Adult Rate <mark style="color:red;">\*</mark>
* Extra Child Rate
* Inclusions

{% hint style="success" %}
**Default Included Occupancy**: If no Included Occupancy value is set by the property, the SiteMinder assumes a default included occupancy of 2 guests.
{% endhint %}

{% tabs %}
{% tab title="OBP Rates" %}
If **Occupancy Based Pricing** is enabled, the `AdditionalGuestAmount` for `AgeQualifyingCode=”10”` is no longer included in the XML.

`AdditionalGuestAmount` will only contain `AgeQualifyingCode=”8”` if your integration supports **Extra Child Rate**.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="100.00" CurrencyCode="EUR" NumberOfGuests="1"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="2"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="400.00" CurrencyCode="EUR" NumberOfGuests="4"/>
						<!-- Additional BaseByGuestAmt elements -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}

{% tab title="Undefined Settings" %}
**Uniform Rates for Undefined Settings**: If the property has not set values for Included Occupancy, Single Guest Discount, or Extra Adult Rate, the SiteMinder will apply the same rate for all occupancy levels.

```xml
<OTA_HotelRateAmountNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<RateAmountMessages HotelCode="HOTELCODE">
		<RateAmountMessage>
			<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
			<Rates>
				<Rate>
					<BaseByGuestAmts>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="1"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="2"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="3"/>
						<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="4"/>
						<!-- Additional BaseByGuestAmt elements -->
					</BaseByGuestAmts>
					<AdditionalGuestAmounts>
						<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/> <!-- Extra Child Rate -->
					</AdditionalGuestAmounts>
					<RateDescription>
						<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text> <!-- Inclusions -->
					</RateDescription>
				</Rate>
			</Rates>
		</RateAmountMessage>
	</RateAmountMessages>
</OTA_HotelRateAmountNotifRQ>
```

{% endtab %}
{% endtabs %}

### Migrate from PDP to OBP <a href="#migrate-from-pdp-to-obp" id="migrate-from-pdp-to-obp"></a>

Existing partners transitioning from Per Day Pricing to Occupancy Based Pricing:

**Maximum Occupancy Requirement**: Your channel must provide the Maximum Occupancy for each room and rate code combination via `OTA_HotelAvailRS` for all connected properties. This data is required for an initial setup of the Maximum Occupancy values in our system.

**Migration Process**: The switch from PDP to OBP occurs **instantaneously for all properties** on your channel simultaneously. Your endpoint must support **both PDP and OBP message formats** to handle the cutover, potential rollbacks, and the verification period. Only disable PDP parsing after Partner Integrations confirms migration stability across all properties.

<table><thead><tr><th width="268">Element/Attribute</th><th width="108">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelRateAmountNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>RateAmountMessages</code></td><td>Element</td><td align="center">1</td><td>Container for rate status messages.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>RateAmountMessage</code></td><td>Element</td><td align="center">1..n</td><td>Single rate status message.</td></tr><tr><td><code>StatusApplicationControl</code></td><td>Element</td><td align="center">1</td><td>Contains date and room identification information.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>The start date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>The end date for which the update is being set. This date is inclusive.</td></tr><tr><td><code>@InvTypeCode</code></td><td>Integer</td><td align="center">1</td><td>Identifies the room.</td></tr><tr><td><code>@RatePlanCode</code></td><td>Element</td><td align="center">0..1</td><td>Identifies the rate.</td></tr><tr><td><code>Rates</code></td><td>String</td><td align="center">1</td><td>Container for rate information.</td></tr><tr><td><code>Rate</code></td><td>String</td><td align="center">1</td><td>Contains individual rate information.</td></tr><tr><td><code>BaseByGuestAmts</code></td><td>Element</td><td align="center">1</td><td>Base charge for a given number of guests.</td></tr><tr><td><code>BaseByGuestAmt</code></td><td>Element</td><td align="center">1..n</td><td>Contains individual rate amounts.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">1</td><td>Positive decimal value for the rate amount after tax.</td></tr><tr><td><code>@NumberOfGuests</code></td><td>Integer</td><td align="center">0..1</td><td>Number of guests in the room. <strong>Mandatory for OBP</strong>.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Element</td><td align="center">0..1</td><td><p>Age qualification code for the rate:</p><p><code>10</code> Adult</p><p><strong>Mandatory for OBP</strong>.</p></td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>AdditionalGuestAmounts</code></td><td>Element</td><td align="center">0..1</td><td>Additional charges for extra guests based on age qualification.</td></tr><tr><td><code>AdditionalGuestAmount</code></td><td>Element</td><td align="center">0..2</td><td>Contains details of extra guest charges.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>String</td><td align="center">1</td><td><p>Age qualification code for the extra guest charge:</p><p><code>10</code> Adult (only for PDP)</p><p><code>8</code> Child</p></td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">1</td><td>Extra charge amount.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>RateDescription</code></td><td>Element</td><td align="center">0..1</td><td>Description of what the rate includes.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Inclusion text (maximum 255 characters).</td></tr></tbody></table>

## 2. **Confirmation Response**

{% tabs %}
{% tab title="Success" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Success/>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Authentication Error" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="4" Code="448">Invalid Username and/or Password</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Incorrect HotelCode" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="6" Code="392">Hotel not found for HotelCode=XXXXXX</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Invalid Included Occupancy" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="137">Invalid included occupancy</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="137">Invalid included occupancy: expecting 2</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Invalid number of adults" %}

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="397">Invalid number of adults</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelRateAmountNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Errors>
				<Error Type="12" Code="397">Invalid number of adults: expecting 5</Error>
			</Errors>
		</OTA_HotelRateAmountNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="269">Element / @Attribute</th><th width="108">Type</th><th width="59" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelRateAmountNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="/pages/eTWh81Gq6djsnm0unSR4">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Common Questions

<details>

<summary>What is the difference between Per Day Pricing (PDP) and Occupancy Based Pricing (OBP)?</summary>

**Per Day Pricing (PDP):**

* Rates set for each individual day
* Base rate applies to default occupancy (configured on booking channel)
* Optional Included Occupancy via `NumberOfGuests` attribute
* Extra guest charges via `AdditionalGuestAmounts` (both adults and children)
* Single Guest Discount shown as `NumberOfGuests="1"`

**Occupancy Based Pricing (OBP):**

* Rates vary based on number of guests
* Separate rate for **each occupancy level** from 1 to Maximum Occupancy
* `NumberOfGuests` attribute **mandatory** for all rates
* Extra Adult Rate **not used** (adult rates already included for each occupancy)
* Only Extra Child Rate in `AdditionalGuestAmounts`

**How to identify:**

* **PDP:** May have single `BaseByGuestAmt` or include `NumberOfGuests` for Included Occupancy
* **OBP:** Multiple consecutive `BaseByGuestAmt` elements (1, 2, 3, 4...) up to Maximum Occupancy

</details>

<details>

<summary>How often will I receive rate updates?</summary>

**Update Frequency:**

* Rate updates sent every **2 minutes** in coordination with ARI updates
* Only changed values for specific room/rate/date combinations are sent
* Maximum payload: **210 days** per message

**Important Dependency:** Rate updates are sent **after** successful processing of availability and restrictions. If availability/restriction updates fail, rate updates will be queued until resolved.

**Update Trigger:** When rates change, all rate components are included:

* Base rates for all occupancy levels (OBP) or base rate with optional Included Occupancy (PDP)
* Extra guest rates (if configured)
* Inclusions text (if configured)

</details>

<details>

<summary>Why am I receiving availability and restrictions updates but not rate updates?</summary>

This is **expected behaviour**. SiteConnect sends updates in a specific order:

**Update Sequence:**

1. **First:** Availability and Restrictions updates sent
2. **Then:** Rate updates sent **only after** successful availability/restrictions response

**Action:** Verify your endpoint is successfully processing and responding to availability/restrictions updates before expecting rate updates.

</details>

<details>

<summary>What does Included Occupancy mean?</summary>

**Included Occupancy** is the number of guests covered by the base rate.

**For PDP (Per Day Pricing):**

* Indicated by `NumberOfGuests` attribute on base rate element
* Example: `NumberOfGuests="2"` means base price covers 2 guests
* If more guests allowed, extra charges can be added via `AdditionalGuestAmounts`
* Single Guest Discount can be applied with `NumberOfGuests="1"`

**For OBP (Occupancy Based Pricing):**

* Every rate has `NumberOfGuests` attribute (mandatory)
* Each occupancy level (1, 2, 3...) has its own complete rate
* No "included occupancy" concept - each occupancy is explicitly priced

**Default Behavior:**

* **PDP:** If `NumberOfGuests` not present, booking channel uses its own default
* **OBP:** If hotel doesn't configure Included Occupancy, SiteMinder defaults to 2 guests as the base

</details>

<details>

<summary>What's the difference between NumberOfGuests="1" and Included Occupancy?</summary>

This depends on whether you're receiving PDP or OBP rates:

**In PDP Messages:**

* `NumberOfGuests="1"` = **Single Guest Discount** (reduced rate for solo travellers)
* `NumberOfGuests="2"` or higher = **Included Occupancy** (base rate for that number of guests)
* If only one `BaseByGuestAmt` without `NumberOfGuests` = base rate with no occupancy specification

**Example PDP with both:**

```xml
<BaseByGuestAmt NumberOfGuests="1" AmountAfterTax="200"/> <!-- Single Guest Discount -->
<BaseByGuestAmt NumberOfGuests="3" AmountAfterTax="300"/> <!-- Included Occupancy -->
```

This means: Rate for 1 guest is 200, rate for 3+ guests is 300, extra charges may apply for 4+ guests.

**In OBP Messages:**

* `NumberOfGuests="1"` = **Rate for 1 guest** (part of occupancy-based pricing)
* All occupancy levels explicitly provided (1, 2, 3, 4...)
* No "discount" concept - each occupancy has its own rate

**Example OBP:**

```xml
<BaseByGuestAmt NumberOfGuests="1" AmountAfterTax="100"/> <!-- Rate for 1 guest -->
<BaseByGuestAmt NumberOfGuests="2" AmountAfterTax="200"/> <!-- Rate for 2 guests -->
<BaseByGuestAmt NumberOfGuests="3" AmountAfterTax="300"/> <!-- Rate for 3 guests -->
```

</details>

<details>

<summary>What happens if the Maximum Occupancy in SiteMinder doesn't match my channel's settings?</summary>

You must return an **"Invalid number of adults"** error when there's a mismatch.

**Expected Behavior:**

* SiteMinder sends rates for 1 to Maximum Occupancy (consecutive)
* Number of `BaseByGuestAmt` elements = Maximum Occupancy value
* Your channel must validate this matches your configured Maximum Occupancy

**Error Response Examples:**

```xml
<Error Type="12" Code="397">Invalid number of adults</Error>
<!-- OR with expected value -->
<Error Type="12" Code="397">Invalid number of adults: expecting 5</Error>
```

**Impact of Mismatched Maximum Occupancy:**

* If hotel **reduces** max occupancy (5 to 4): Rates for 5 guests no longer sent, potentially causing booking issues for 5-guest reservations
* If hotel **increases** max occupancy (4 to 5): Your channel receives new rate for 5 guests

</details>

<details>

<summary>How many occupancy rates can I receive in an OBP message?</summary>

You will receive **one rate for each occupancy level** from 1 to the Maximum Occupancy.

**Number of Rates:**

* Determined by `MaxOccupancy` value provided in your Rooms and Rates response
* Valid range: 1 to 50
* Always consecutive: 1, 2, 3, 4... up to max

**Examples:**

* `MaxOccupancy="3"` → 3 rates (for 1, 2, and 3 guests)
* `MaxOccupancy="6"` → 6 rates (for 1, 2, 3, 4, 5, and 6 guests)

**Message Size Considerations:** Higher Maximum Occupancy values result in larger messages. Plan your parsing logic to handle up to 50 `BaseByGuestAmt` elements per rate update.

</details>

<details>

<summary>How does SiteConnect sync Extra Adult Rate, Extra Child Rate, and Single Guest Discount in an PDP?</summary>

**Sync Behavior:**

* These values are **rate plan level settings** (not date-specific)
* Once configured, a **full sync is sent** for the entire rate plan
* All dates for that room/rate combination receive the same extra guest rates and discount

**Update Trigger:**

* When hotel first configures these values
* When hotel changes these values
* During regular rate updates (included with base rates)

**In Messages:**

* **Extra Adult/Child Rates:** Sent in `AdditionalGuestAmounts` section
* **Single Guest Discount:** Sent as `BaseByGuestAmt` with `NumberOfGuests="1"`
* Applied across all dates in the message date range

**Example:** If a hotel sets Extra Adult Rate to 50 EUR for a rate plan, all future rate updates for that rate plan will include `<AdditionalGuestAmount AgeQualifyingCode="10" Amount="50" CurrencyCode="EUR"/>` regardless of the date range.

</details>

<details>

<summary>I added a Single Guest Discount and stopped receiving rate updates. Why?</summary>

This occurs when the Single Guest Discount results in a **negative rate**.

**Example Problem:**

* Base rate: 50 EUR
* Single Guest Discount: 60 EUR
* **Result:** 50 - 60 = **-10 EUR** (negative rate)

**System Behavior:**

* SiteMinder detects the negative rate
* Rate updates for that room-rate combination **stop being sent**
* Error prevents invalid pricing from reaching your channel

**Resolution:**

* Hotel must adjust the Single Guest Discount to be **less than** the base rate
* Once corrected, rate updates will resume

**Best practice:** Validate that Single Guest Discount ≤ Base Rate in your channel's hotel management interface

</details>

<details>

<summary>Are rates received from SiteConnect inclusive or exclusive of taxes?</summary>

All rates are sent in the `AmountAfterTax` attribute, but the **actual tax inclusion depends on hotel configuration**.

**What SiteConnect Sends:**

* Attribute: `AmountAfterTax` (always used)
* Value: Daily rate amount as configured by hotel
* No explicit tax flag to indicate inclusive vs. exclusive

**Common Practice:**

* Most hotels load **all-inclusive rates** (required by major channels like Booking.com, Expedia)
* Your channel can handle rates on your extranet as you see fit

**Critical:** Hotel must be informed and agree on how rates are interpreted

**Recommendation:**

* Document your channel's rate handling policy clearly
* Communicate this to hotels during onboarding
* Consider adding a toggle in your extranet if you support both models

</details>

<details>

<summary>We only support one currency. Can we work without receiving CurrencyCode?</summary>

Yes, you can request to have `CurrencyCode` disabled.

**Default Behavior:**

* SiteConnect sends `CurrencyCode` attribute by default
* Uses ISO 4217 currency codes (EUR, USD, GBP, etc.)
* Allows properties to select currency to send

**Single Currency Channels:**

* Request Partner Integrations team to disable `CurrencyCode`
* This is a **channel-level setting** (applies to all properties)
* Rate messages will be sent without the `CurrencyCode` attribute
* Your channel assumes your supported currency

**Multi-Currency Support:**

* If you support multiple currencies, keep `CurrencyCode` enabled
* Each hotel can configure their preferred currency in SiteMinder
* Only one currency per request (never mixed)

</details>

<details>

<summary>Will I receive both PDP and OBP messages during migration to Occupancy Based Pricing?</summary>

Yes, your channel must support both message formats during the migration period.

**Migration Switch:**

* PDP to OBP migration happens **simultaneously for all properties** on your channel
* The switch occurs **instantaneously** - all properties convert at once
* Your endpoint must process both PDP and OBP messages to ensure continuity

**Why Both Formats:**

* Handle the instantaneous cutover moment
* Support potential rollback to PDP if issues occur
* Maintain service during the verification period

**When to Disable PDP:** Only after SiteMinder Partner Integrations confirms:

* All properties successfully receiving OBP updates
* Verification period completed without issues
* Migration is stable with no rollback required

**How to Detect Format:**

* **OBP:** Multiple consecutive `BaseByGuestAmt` with `NumberOfGuests="1"`, `"2"`, `"3"`...
* **PDP:** Single or non-consecutive `BaseByGuestAmt` elements

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Reservations

Push reservations messages to SiteMinder Platform in real-time.

{% hint style="info" %}
**API:** SiteConnect · **Operation:** Reservations · **Direction:** Channel → SM
{% endhint %}

## What is Reservations?

**Reservation** is a delivery method where the booking channel actively pushes reservations, modifications, and cancellations directly to the SiteMinder Platform in real-time. This integration ensures that properties receive up-to-date booking information, maintaining consistency and reducing the risk of overbooking.

**Key Characteristics:**

* **Real-time delivery:** Reservations pushed immediately after booking
* **Three message types:** New bookings (`Commit`), modifications (`Modify`), and cancellations (`Cancel`)
* **Atomic processing:** Each reservation is processed entirely or rejected entirely
* **Availability updates:** SiteMinder sends updated availability to all channels after processing reservations

**Reservation Notification Email:** SiteConnect can optionally send reservation notification emails to hotels based on the data in your `OTA_HotelResNotifRQ`. If your channel cannot send reservation emails directly to hotels, this feature can be requested during integration. It is not enabled by default.

**Cancellation Policies:** Cancellation policies are managed directly between the hotel and your booking channel and are not handled through the SiteMinder API.

{% hint style="warning" %}
**Production Endpoint Update:** SiteMinder now uses a single global endpoint for all reservation delivery, replacing the previous regional endpoint model (APAC and EMEA/AMERS). If your integration currently uses region-specific endpoints, please contact the [Partner Integrations](https://www.siteminder.com/partners-contact/) team to migrate to the global endpoint for simplified routing and improved reliability.
{% endhint %}

## Integration Requirements

Understand the essential requirements for API integration, including connectivity, authentication, message formats, and security protocols.

<table data-header-hidden><thead><tr><th width="199.954833984375">Category</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>Web Service Endpoint</strong></td><td><ul><li>SiteMinder will provide a single global endpoint for all hotels for the booking channel to push <code>OTA_HotelResNotifRQ</code> messages and receive <code>OTA_HotelResNotifRQ</code> responses indicating success or failure.</li><li><strong>Test Environment Endpoint:</strong> <a href="https://tpi-cm-siteconn.preprod.siteminderlabs.com/reservation-gateway/services">https://tpi-cm-siteconn.preprod.siteminderlabs.com/reservation-gateway/services</a></li></ul></td></tr><tr><td><strong>Authentication</strong></td><td><ul><li>SiteMinder will provide a single username/password for all hotels.</li><li>The booking channel must include authentication credentials within the <strong>SOAP Security header</strong> of each request <code>OTA_HotelResNotifRQ</code>.</li></ul></td></tr><tr><td><strong>Message Structure</strong></td><td><ul><li>All messages must adhere to the SOAP message format.</li><li>OTA message must be encapsulated within the SOAP Body.</li><li>Requests must include a SOAP Security Header for authentication.</li><li>Responses will be returned in a SOAP envelope with empty SOAP Header.</li></ul></td></tr><tr><td><strong>Content-Type</strong></td><td><code>text/xml; charset=utf-8</code></td></tr><tr><td><strong>Version</strong></td><td><code>SOAP 1.1</code></td></tr><tr><td><strong>Protocol &#x26; Security</strong></td><td><ul><li>All communication must occur over <strong>HTTPS</strong> using <strong>TLS 1.2 or higher</strong>.</li><li>Non-secure (HTTP) connections are <strong>not permitted</strong>.</li><li>Communication is synchronous request/response pairs.</li><li>Each message is atomic - processed entirely or not at all.</li></ul></td></tr></tbody></table>

## Message Exchange Flow

When SiteMinder receives bookings from channels, it delivers them to your PMS using a synchronous SOAP/HTTPS exchange. Each reservation triggers a separate request-response cycle.

1. **Reservation Message (booking channel to SiteMinder):** `OTA_HotelResNotifRQ`\
   Delivers a single reservation message (new booking, modification, or cancellation).
2. **Confirmation Response (booking channel to PMS):** `OTA_HotelResNotifRS`\
   Confirms successful receipt or reports processing failure.

{% hint style="warning" %}
SiteMinder will send `OTA_HotelAvailNotifRQ` to the booking channel with the **updated availability** after the reservations, modifications, and cancellations are processed on the SiteMinder Platform. Refer to the [Availability and Restrictions](/siteconnect-api/reference/availability-and-restrictions).
{% endhint %}

## Security Header

The Security Header is a mandatory SOAP header that authenticates every reservation request from your booking channel to SiteMinder endpoint. It contains the username and password credentials that we provide to the booking channel during integration setup.

**Key Requirements:**

* **Validation**: Our endpoint will validate these credentials on every request.
* **Scope**: One set of credentials is used for all properties in your integration.
* **Security**: Credentials are transmitted as plain text within the HTTPS encrypted channel.
* **Response**: Invalid credentials will return a SOAP fault with appropriate error code.

{% hint style="info" %}
The only acceptable value for the **Password @Type** attribute is *<http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText>.* Plain text passwords are acceptable as all communication is done over encrypted HTTP (HTTPS).
{% endhint %}

{% tabs %}
{% tab title="Reservation Message" %}
Requests must include a SOAP Security Header for authentication.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security SOAP-ENV:mustUnderstand="1"
			xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRQ
			xmlns="http://www.opentravel.org/ota/2003/05" ResStatus="Commit" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelResNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}

{% tab title="Confirmation Response" %}
Responses must be returned in a SOAP envelope with an empty SOAP Header.

```xml
<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header/>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRS
			xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
			<Success/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</OTA_HotelResNotifRS>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

{% endtab %}
{% endtabs %}

## Multiplicity

In the SOAP Specification tables below **M** refers to the number of instances or occurrences of an element or attribute that are allowed or required in a given context. It defines how many times a particular component (element or attribute) can appear within a specific structure.

<table><thead><tr><th width="94">M</th><th>Definition</th></tr></thead><tbody><tr><td><strong>1</strong></td><td>The element or attribute must be present exactly once.</td></tr><tr><td><strong>0..1</strong></td><td>The element or attribute is optional; it can be present zero or one time.</td></tr><tr><td><strong>0..n</strong></td><td>The element or attribute can be present zero or more times, with no upper limit (where <strong>n</strong> represents an infinite number of occurrences).</td></tr><tr><td><strong>1..n</strong></td><td>The element or attribute must be present at least once and can be present any number of times, with no upper limit.</td></tr><tr><td><strong>n..m</strong></td><td>Specific range, the element or attribute must be present at least <strong>n</strong> times and no more than <strong>m</strong> times (where <strong>n</strong> and <strong>m</strong> are specific numbers).</td></tr></tbody></table>

## 1. **Reservation Message**

### OTA\_HotelResNotifRQ

The `OTA_HotelResNotifRQ` message carries reservation data from your booking channel to SiteMinder. Each message contains exactly one reservation (new booking, modification, or cancellation).

* Reservation (Initial Delivery) <mark style="color:red;">\*</mark>
* Reservation Multi-Room
* Reservation Modifications
* Reservation Cancellations

**Reservation Modifications and Cancellations**: SiteMinder uses specific reservation status fields to differentiate between types of reservation actions. Modifications are identified using **`ResStatus`** **`Modify`**, while cancellations are marked with **`ResStatus`** **`Cancel`**. For both actions, the full reservation data must be provided, including the original reservation details and the timestamp reflecting when the modification or cancellation was made. This ensures that the booking system processes changes and cancellations accurately and consistently across all properties.

{% hint style="warning" %}
**Reservations follow a one-way lifecycle:** Commit → Modify → Cancel. Never send Modify or Cancel messages for reservations that are already cancelled. Once a reservation is cancelled, it is in a terminal state and no further messages should be sent.
{% endhint %}

{% tabs %}
{% tab title="Commit" %}

```xml
<OTA_HotelResNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" ResStatus="Commit" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</OTA_HotelResNotifRQ>
```

{% endtab %}

{% tab title="Modify" %}

```xml
<OTA_HotelResNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" ResStatus="Modify" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</OTA_HotelResNotifRQ>
```

{% endtab %}

{% tab title="Cancel" %}

```xml
<OTA_HotelResNotifRQ
	xmlns="http://www.opentravel.org/OTA/2003/05" ResStatus="Cancel" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</OTA_HotelResNotifRQ>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="133">Type</th><th width="53.942626953125" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>OTA_HotelResNotifRQ</code></strong></td><td>Element</td><td align="center">1</td><td>Root element for the request.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@ResStatus</code></td><td>Enumeration</td><td align="center">1</td><td><p>Specifies the booking status:</p><p><code>Commit</code></p><p><code>Modify</code></p><p><code>Cancel</code></p></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses. Preferred format: UUID <code>8-4-4-4-12</code>.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the request was generated. <code>TimeStamp</code> must use <code>ISO 8601</code> format.</td></tr><tr><td><code>@Version</code></td><td>Decimal</td><td align="center">1</td><td>Specifies the API version. Must be set to <code>1.0</code>.</td></tr></tbody></table>

### Source

{% tabs %}
{% tab title="Source" %}

```xml
<POS>
	<Source>
		<RequestorID Type="22" ID="ABC"/>
		<BookingChannel Primary="true">
			<CompanyName Code="ABC">Channel Name</CompanyName>
		</BookingChannel>
	</Source>
	<!-- Additional Source element -->
</POS>
```

{% endtab %}

{% tab title="Second Source" %}

```xml
<POS>
	<Source>
		<RequestorID Type="22" ID="ABC"/>
		<BookingChannel Primary="true">
			<CompanyName Code="ABC">Channel Name</CompanyName>
		</BookingChannel>
	</Source>
	<Source>
		<BookingChannel Primary="false">
			<CompanyName Code="CBA">Affiliated Channel</CompanyName>
		</BookingChannel>
	</Source>
</POS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>POS</code></strong></td><td>Element</td><td align="center">1</td><td>Contains source details.</td></tr><tr><td><code>Source</code></td><td>Element</td><td align="center">1..2</td><td>Contains BookingChannel details.</td></tr><tr><td><code>RequestorID</code></td><td>Element</td><td align="center">1</td><td>Only present in the first Source element. Identifies the system sending the reservation.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>22</code> (ESRP).</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Channel code. The <code>ID</code> used will be agreed by trading partners and remain consistent across messages.</td></tr><tr><td><code>BookingChannel</code></td><td>Element</td><td align="center">1</td><td>Contains booking channel information.</td></tr><tr><td><code>@Primary</code></td><td>Boolean</td><td align="center">1</td><td><p><code>true</code> for the primary booking channel in the first Source element.</p><p><code>false</code> in the second Source element, if present.</p></td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">1</td><td>Name of the booking channel.</td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Code of the booking channel. <br>- Same as <code>RequestorID</code> <code>ID</code> for the primary source.<br>- Your internal reference code for the secondary source.</td></tr></tbody></table>

### Reservation

**Reservation IDs:** `UniqueID` `ID` must be unique across all properties connected at all times. If a reservation is received with an ID that has already been used, it will be ignored, even if it is for a different hotel. To ensure long-term uniqueness and minimize the risk of reuse, we recommend using a UniqueID with at least 7 numeric characters. Incorporating alphanumeric characters is also encouraged to further increase the number of possible combinations for reservations.

{% hint style="danger" %}
`UniqueID` `ID` must contain only alphanumeric characters (A-Z, a-z, 0-9). Special characters must be avoided.
{% endhint %}

```xml
<HotelReservations>
	<HotelReservation CreateDateTime="2024-07-06T15:27:41+00:00" LastModifyDateTime="2024-07-06T15:27:41+00:00">
		<UniqueID Type="14" ID="123456789"/>
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</HotelReservation>
</HotelReservations>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="57" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>HotelReservations</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the reservation details.</td></tr><tr><td><code>HotelReservation</code></td><td>Element</td><td align="center">1</td><td>Contains the specific reservation information.</td></tr><tr><td><code>@CreateDateTime</code></td><td>DateTime</td><td align="center">1</td><td>Date and time when the reservation was first made. <strong>Must be set when <code>ResStatus</code> is <code>Commit</code>, <code>Modify</code> and <code>Cancel</code></strong>. <code>CreateDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>@LastModifyDateTime</code></td><td>DateTime</td><td align="center">0..1</td><td>Date and time when the reservation was last modified. <strong>Must be set when <code>ResStatus</code> is <code>Modify</code> or <code>Cancel</code></strong>. <code>LastModifyDateTime</code> must follow the <code>ISO 8601</code> Date and Time format.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">1</td><td>Unique identifier of the reservation in the system which sent the message.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>14</code> (Reservation).</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Actual confirmation number.</td></tr></tbody></table>

### RoomStays

**Multi-Room Reservations:** Multi-room reservations are sent in a single `OTA_HotelResNotifRQ` with multiple `RoomStay` elements, each representing one room.

```xml
<RoomStays>
	<RoomStay PromotionCode="AUTUNM2024">
		<!-- ... other elements and attributes have been omitted for brevity ... -->
	</RoomStay>
	<!-- Additional RoomStay elements -->
</RoomStays>
```

<table><thead><tr><th width="252">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomStays</code></strong></td><td>Element</td><td align="center">1</td><td>Contains details of all room stays.</td></tr><tr><td><code>RoomStay</code></td><td>Element</td><td align="center">1..n</td><td>One instance of <code>RoomStay</code> per room type booked.</td></tr><tr><td><code>@PromotionCode</code></td><td>String</td><td align="center">0..1</td><td>If configured, this is the promotion code indicating, for instance, a specific marketing campaign (not the rate code).</td></tr></tbody></table>

### RoomTypes

```xml
<RoomTypes>
	<RoomType RoomTypeCode="TPL">
		<RoomDescription Name="Triple Room">Double bed and single bed.</RoomDescription>
	</RoomType>
</RoomTypes>
```

<table><thead><tr><th width="255">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomTypes</code></strong></td><td>Element</td><td align="center">0..1</td><td>Provides more information about the room type for this room stay.</td></tr><tr><td><code>RoomType</code></td><td>Element</td><td align="center">1</td><td>Contains specific information about the room type.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">1</td><td>Code of the room booked.</td></tr><tr><td><code>RoomDescription</code></td><td>Element</td><td align="center">1</td><td>Description of the room.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">1</td><td>Name of the room.<br>Required for <strong>Reservation Notification Email</strong> feature.</td></tr></tbody></table>

### RatePlans

**Commission Purpose:** The `CommissionPayableAmount` represents the amount the hotel owes your booking channel. This is included in the RoomStay total and helps SiteMinder provide better reporting to hotels.

**Best Practice:** Although optional, sending commission amounts is strongly recommended because:

* Some hotels configure their PMS to receive reservation rates with or without commission
* Provides hotels with accurate financial reporting
* Enables better reconciliation between channels and properties

```xml
<RatePlans>
	<RatePlan RatePlanCode="BAR">
		<RatePlanDescription>Best Available Rate.</RatePlanDescription>
		<Commission>
			<CommissionPayableAmount Amount="60.00" CurrencyCode="EUR"/>
		</Commission>
		<MealsIncluded MealPlanCode="14"/>
		<!-- Additional MealsIncluded elements -->
	</RatePlan>
</RatePlans>
```

<table><thead><tr><th width="284">Element / @Attribute</th><th width="112">Type</th><th width="61" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RatePlans</code></strong></td><td>Element</td><td align="center">0..1</td><td>Provides more information about the rate plan for this room stay.</td></tr><tr><td><code>RatePlan</code></td><td>Element</td><td align="center">1</td><td>Contains details about the specific rate plan.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">1</td><td>Code of the rate booked.</td></tr><tr><td><code>RatePlanDescription</code></td><td>Element</td><td align="center">1</td><td>Description of the rate plan.<br>Required for <strong>Reservation Notification Email</strong> feature.</td></tr><tr><td><code>Commission</code></td><td>Element</td><td align="center">0..1</td><td>Commission amount associated with the rate plan.</td></tr><tr><td><code>CommissionPayableAmount</code></td><td>Element</td><td align="center">1</td><td>Amount of commission to be paid.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">1</td><td>Commission amount.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217</a> currency codes.</td></tr><tr><td><code>MealsIncluded</code></td><td>Element</td><td align="center">0..n</td><td>Used to identify the types of meals included with a rate plan.</td></tr><tr><td><code>@MealPlanCode</code></td><td>Integer</td><td align="center">0..1</td><td>Refer to <a href="/pages/E3K5PNmESCObm8TXoLUy">Meal Plan Type (MPT)</a>.</td></tr></tbody></table>

### RoomRates

**AmountBeforeTax vs AmountAfterTax:**

* Use `AmountAfterTax` if your rates include taxes
* Use `AmountBeforeTax` if your rates exclude taxes
* You can send both, but amounts must differ (AfterTax must be greater than BeforeTax)
* At least one must be provided

**Multiple Tax Types:** You can send multiple `Tax` elements with different Tax Codes (e.g., GST/VAT, City Tax) to itemize tax types. Reference the Fee Tax Type (FTT) table for codes.

**Promotional Rates and Zero-Rate Nights:**

* **Best practice:** Send actual per-night rates (including 0 for free nights)
* **Alternative:** Average total across all nights
* **Recommendation:** Add comment explaining any discounts or promotions
* **Validation:** SiteMinder accepts reservations with 0 rate totals

{% tabs %}
{% tab title="Room Rates" %}
This is the **complete RoomRates structure** showing all standard elements contained in a typical reservation. It demonstrates a 3-night stay with consistent nightly rates, including tax breakdown and a linked service/extra charge.

To understand the complete `<RoomRate>` anatomy and how to structure daily rates, explore the three rate variation patterns below:

* **Same Value Per Night:** All nights charged at identical rates
* **Different Value Per Night:** Each night has a distinct rate
* **Combined:** Groups of consecutive nights at the same rate

```xml
<RoomRates>
	<RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
		<Rates>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-05" ExpireDate="2024-10-08">
				<Base AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
					<Taxes>
						<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
						<!-- Additional Tax elements -->
					</Taxes>
				</Base>
				<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
					<Taxes>
						<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
						<!-- Additional Tax elements -->
					</Taxes>
				</Total>
			</Rate>
		</Rates>
		<ServiceRPHs>
			<ServiceRPH RPH="1"/>
			<!-- Additional ServiceRPH elements -->
		</ServiceRPHs>
	</RoomRate>
</RoomRates>
```

{% endtab %}

{% tab title="Same Value Per Night" %}
A single `<Rate>` element spans the entire stay period, with the Base and Total amounts representing the sum of all nights at a uniform nightly rate. This is the most efficient structure when rates don't fluctuate during the stay.

**Example breakdown:**

* 3-night stay (Oct 5-7)
* Total: €558.00 before tax / €620.00 after tax
* Nightly rate: €186.00 before tax per night / €206.66 after tax per night

```xml
<RoomRates>
	<RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
		<Rates>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-05" ExpireDate="2024-10-08">
				<Base AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
		</Rates>
	</RoomRate>
</RoomRates>
<TimeSpan Start="2024-10-05" End="2024-10-08"/>
<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
```

{% endtab %}

{% tab title="Different Value Per Night" %}
Each night is represented by a separate `<Rate>` element with its individual pricing. The `EffectiveDate` and `ExpireDate` span exactly one night, clearly showing the rate breakdown for each date.

**Example breakdown:**

* Night 1 (Oct 5): €153.00 before tax / €170.00 after tax
* Night 2 (Oct 6): €180.00 before tax / €200.00 after tax
* Night 3 (Oct 7): €225.00 before tax / €259.00 after tax
* Total: €558.00 before tax / €620.00 after tax

```xml
<RoomRates>
	<RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
		<Rates>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-05" ExpireDate="2024-10-06">
				<Base AmountBeforeTax="153.00" AmountAfterTax="170.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-06" ExpireDate="2024-10-07">
				<Base AmountBeforeTax="180.00" AmountAfterTax="200.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-07" ExpireDate="2024-10-08">
				<Base AmountBeforeTax="225.00" AmountAfterTax="250.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
		</Rates>
	</RoomRate>
</RoomRates>
<TimeSpan Start="2024-10-05" End="2024-10-08"/>
<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
```

{% endtab %}

{% tab title="Combined" %}
Groups consecutive nights with identical rates into single `<Rate>` elements, while separating periods where rates differ. This optimizes message size while maintaining rate accuracy.

**Example breakdown:**

* Nights 1-2 (Oct 5-6): €360.00 before tax (€180/night) / €400.00 after tax (€200/night)
* Night 3 (Oct 7): €198.00 before tax / €220.00 after tax
* Total: €558.00 before tax / €6200.00 after tax

```xml
<RoomRates>
	<RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
		<Rates>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-05" ExpireDate="2024-10-07">
				<Base AmountBeforeTax="360.00" AmountAfterTax="400.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-07" ExpireDate="2024-10-08">
				<Base AmountBeforeTax="198.00" AmountAfterTax="220.00" CurrencyCode="EUR"/>
			<!-- ... other elements and attributes have been omitted for brevity ... -->
			</Rate>
		</Rates>
	</RoomRate>
</RoomRates>
<TimeSpan Start="2024-10-05" End="2024-10-08"/>
<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="253">Element / @Attribute</th><th width="128">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>RoomRates</code></strong></td><td>Element</td><td align="center">1</td><td>Contains details of the rates applied to the room stay.</td></tr><tr><td><code>RoomRate</code></td><td>Element</td><td align="center">1</td><td>One RoomRate per RoomStay. Multiple rates are listed under the RoomRate.</td></tr><tr><td><code>@RoomTypeCode</code></td><td>String</td><td align="center">1</td><td>Code of the room booked.</td></tr><tr><td><code>@RatePlanCode</code></td><td>String</td><td align="center">0..1</td><td>Code of the rate plan booked. Must be included if RoomStay / RatePlans is present.</td></tr><tr><td><code>@NumberOfUnits</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>1</code>. If there are multiple RoomStays for the same RoomTypeCode and RatePlanCode, multiple RoomStay elements should be sent.</td></tr><tr><td><code>Rates</code></td><td>Element</td><td align="center">1</td><td>Contains rate details</td></tr><tr><td><code>Rate</code></td><td>Element</td><td align="center">0..n</td><td>Rate will contain a timespan for which a rate will apply for a room type. Multiple instances of Rate will be sent if rate changes apply.</td></tr><tr><td><code>@UnitMultiplier</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>1</code>.</td></tr><tr><td><code>@RateTimeUnit</code></td><td>String</td><td align="center">1</td><td>Must be set to <code>Day</code>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">1</td><td>Starting date of the rate. This date is inclusive.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">1</td><td>Expire date is the first day after the applicable period. This date is not inclusive.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>Base</code></td><td>Element</td><td align="center">1</td><td>Base amount charged for the accommodation.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217</a> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Type</code></td><td>Enumeration</td><td align="center">0..1</td><td><p>Indicates whether the tax is:</p><p><code>inclusive</code></p><p><code>exclusive</code></p><p><code>cumulative</code></p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217</a> currency codes.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">0..1</td><td>Total amount charged, including additional occupants and fees. If empty, assume the Base amount equals the Total amount.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <a href="https://en.wikipedia.org/wiki/ISO_4217">ISO 4217</a> currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">0..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Type</code></td><td>Enumeration</td><td align="center">0..1</td><td><p>Indicates whether the tax is:</p><p><code>inclusive</code></p><p><code>exclusive</code></p><p><code>cumulative</code></p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>ServiceRPHs</code></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ServiceRPH</code> elements.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">0..n</td><td>Links a service to the Service information at the HotelReservation level (if applicable).<br>Service at the <code>RoomRate</code> level.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Reference to the ServiceRPH at the HotelReservation level.</td></tr></tbody></table>

### **GuestCounts**

{% tabs %}
{% tab title="Full Example" %}
{% code title="2 adults, 2 children (age 7 and 10), 1 infant" %}

```xml
<GuestCounts>
	<GuestCount AgeQualifyingCode="10" Count="2"/>
	<GuestCount AgeQualifyingCode="8" Age="7" Count="1"/>
	<GuestCount AgeQualifyingCode="8" Age="10" Count="1"/>
	<GuestCount AgeQualifyingCode="7" Count="1"/>
	<!-- Additional GuestCount elements -->
</GuestCounts>
```

{% endcode %}
{% endtab %}

{% tab title="Minimum Example" %}
{% code title="1 adult, 0 children, 0 infant" %}

```xml
<GuestCounts>
	<GuestCount AgeQualifyingCode="10" Count="1"/>
	<!-- Only GuestCount with Count greater than or equal to 1 -->
</GuestCounts>
```

{% endcode %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>GuestCounts</code></strong></td><td>Element</td><td align="center">1</td><td>Total guest counts, divided by age group (adult, child, infant). Adult count must always be sent.</td></tr><tr><td><code>GuestCount</code></td><td>Element</td><td align="center">1..n</td><td>Represents the count for a specific age group.</td></tr><tr><td><code>@AgeQualifyingCode</code></td><td>Integer</td><td align="center">1</td><td><p><code>10</code> = Adult (mandatory)</p><p><code>8</code> = Child (optional)</p><p><code>7</code> = Infant (optional)</p></td></tr><tr><td><code>@Count</code></td><td>Integer</td><td align="center">1</td><td>Number of guests for this age group.<br>Count must be greater than or equal to 1.</td></tr><tr><td><code>@Age</code></td><td>Integer</td><td align="center">0..1</td><td>Age of the guest, required only for children and infants.</td></tr></tbody></table>

### TimeSpan

The `TimeSpan` element defines the check-in and check-out dates for the reservation. **SiteConnect requires a minimum 1-night stay** - the check-out date must be at least one day after the check-in date. Same-day bookings (day-use reservations where arrival and departure occur on the same date) are not supported and will be rejected with a validation error.

```xml
<TimeSpan Start="2024-10-05" End="2024-10-08"/>
```

<table><thead><tr><th width="250">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>TimeSpan</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the timespan for the <code>RoomStay</code>.<br><strong>Maximum 749 days</strong></td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">1</td><td>Check-in date.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">1</td><td>Check-out date. <br>Must use <code>YYYY-MM-DD</code> format.<br><strong>Must be after <code>Start</code></strong> (minimum 1-night stay required). Same-day bookings will be rejected.</td></tr></tbody></table>

### RoomStayTotal

```xml
<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
	<Taxes>
		<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
		<!-- Additional Tax elements -->
	</Taxes>
</Total>
```

<table><thead><tr><th width="251">Element / @Attribute</th><th width="134">Type</th><th width="61" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Total</code></strong></td><td>Element</td><td align="center">1</td><td>Container for the total amount elements.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1..n</td><td>Contains specific tax information.</td></tr><tr><td><code>@Type</code></td><td>Enumeration</td><td align="center">0..1</td><td><p>Indicates whether the tax is:</p><p><code>inclusive</code></p><p><code>exclusive</code></p><p><code>cumulative</code></p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Amount of the tax/fee transferred.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr></tbody></table>

### **BasicPropertyInfo**

```xml
<BasicPropertyInfo HotelCode="HOTELCODE" HotelName="The Hotel Name"/>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>BasicPropertyInfo</code></strong></td><td>Element</td><td align="center">1</td><td>Contains basic identification details for the hotel associated with the reservation.</td></tr><tr><td><code>@HotelCode</code></td><td>String</td><td align="center">1</td><td>Identifier for the hotel.</td></tr><tr><td><code>@HotelName</code></td><td>String</td><td align="center">0..1</td><td>Name of the hotel.</td></tr></tbody></table>

### ServiceRPHs

```xml
<ServiceRPHs>
	<ServiceRPH RPH="1"/>
	<!-- Additional ServiceRPH elements -->
</ServiceRPHs>
```

<table><thead><tr><th width="256">Element / @Attribute</th><th width="112">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ServiceRPHs</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ServiceRPH</code> elements.</td></tr><tr><td><code>ServiceRPH</code></td><td>Element</td><td align="center">1..n</td><td>Service at the <code>RoomStay</code> level.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links a <code>Service</code> to the Service information provided at the HotelReservation level (if applicable).</td></tr></tbody></table>

### ResGuestRPHs

```xml
<ResGuestRPHs>
	<ResGuestRPH RPH="1"/>
	<!-- Additional ResGuestRPH elements -->
</ResGuestRPHs>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGuestRPHs</code></strong></td><td>Element</td><td align="center">0..1</td><td>Container for the <code>ResGuestRPH</code> elements.</td></tr><tr><td><code>ResGuestRPH</code></td><td>Element</td><td align="center">1..n</td><td>Container for the <code>RPH</code> attribute.</td></tr><tr><td><code>@RPH</code></td><td>Integer</td><td align="center">1</td><td>Links the <code>RoomStay</code> to <code>ResGuest</code>. Find the links in <a href="#resguests">ResGuests</a>.</td></tr></tbody></table>

### **Comments**

```xml
<Comments>
	<Comment>
		<Text>See the room stay comments here</Text>
	</Comment>
</Comments>
```

<table><thead><tr><th width="253">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Comments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains comment for the <code>RoomStay</code>.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1</td><td>Holds the actual comment.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td><p>The content of the comment.</p><p>PCI sensitive data is prohibited.</p></td></tr></tbody></table>

### SpecialRequests

```xml
<SpecialRequests>
	<SpecialRequest Name="Extra Bed">
		<Text>Yes</Text>
	</SpecialRequest>
	<!-- Additional ServiceRPH elements -->
</SpecialRequests>
```

<table><thead><tr><th width="257">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>SpecialRequests</code></strong></td><td>Element</td><td align="center">0</td><td>Contains special requests for the <code>RoomStay</code>.</td></tr><tr><td><code>SpecialRequest</code></td><td>Element</td><td align="center">0..n</td><td>Holds the actual special request.</td></tr><tr><td><code>@Name</code></td><td>String</td><td align="center">1</td><td>Special request type (e.g., bedding configuration, smoking, cot, extra bed).</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">0..1</td><td>Special request text.</td></tr></tbody></table>

### Services

**ServiceInventoryCode**: Use [this list](/siteconnect-api/additional-resources/reference-tables/service-and-extra-charge) as a guide to code your extras/services. You can use additional codes not on the list such as PARKING or your own service identifier codes generated in your system.

{% tabs %}
{% tab title="Services" %}

```xml
<Services>
    <Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="1" Quantity="1" ID="12346">
        <Price>
            <Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="EUR">
                <Taxes Amount="0.25">
                    <Tax Code="19" Percent="10" Amount="0.25">
                        <TaxDescription>
                            <Text>GST 10 percent</Text>
                        </TaxDescription>
                    </Tax>
                </Taxes>
            </Base>
            <Total AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="EUR">
                <Taxes Amount="0.25">
                    <Tax Code="19" Percent="10" Amount="0.25">
                        <TaxDescription>
                            <Text>GST 10 percent</Text>
                        </TaxDescription>
                    </Tax>
                </Taxes>
            </Total>
            <RateDescription>
                <Text>Extra person charge EUR 2.50 per day for cot</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2024-10-05" End="2024-10-08"/>
        </ServiceDetails>
    </Service>
    <!-- Additional Service elements -->
</Services>
```

{% endtab %}

{% tab title="RoomRate Level" %}
Example of a reservation with a service linked to the **RoomRate**.\
ServiceRPH present within `<RoomRate>`.\
Service cost is **included** in the **RoomRate Total, RoomStay Total** and **ResGlobalInfo Total.**\
Service cost is **not included** in the **RoomRate Base**

MEAL service for 3 nights. **Quantity must be 1**.\
Service Total must reflect total for all nights/quantities booked.\
The connected PMS will receive a breakdown of this service (per night) based on the TimeSpan.

```xml
<RoomStays>
    <RoomStay>
        <RoomTypes>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomTypes>
        <RatePlans>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RatePlans>
        <RoomRates>
            <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
                <Rates>
                    <Base AmountBeforeTax="450.00" AmountAfterTax="495.00" CurrencyCode="EUR"/>
                    <Total AmountBeforeTax="480.00" AmountAfterTax="528.00" CurrencyCode="EUR"/>
                </Rates>
                <ServiceRPHs>
                    <ServiceRPH RPH="1"/>
                </ServiceRPHs>
            </RoomRate>
        </RoomRates>
        <!-- ... other elements and attributes have been omitted for brevity ... -->
        <Total AmountBeforeTax="480.00" AmountAfterTax="528.00" CurrencyCode="EUR"></Total>
    </RoomStay>
</RoomStays>
<Services>
    <Service ServiceInventoryCode="MEAL" Inclusive="true" ServiceRPH="1" Quantity="1" ID="12346">
        <Price>
            <Base AmountBeforeTax="10.00" AmountAfterTax="11.00" CurrencyCode="EUR"/>
            <Total AmountBeforeTax="30.00" AmountAfterTax="33.00" CurrencyCode="EUR"/>
            <RateDescription>
                <Text>Breakfast Buffet per person per night</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-10-05" End="2025-10-08"/>
        </ServiceDetails>
    </Service>
</Services>
<ResGlobalInfo>
    <!-- ... other elements and attributes have been omitted for brevity ... -->
    <Total CurrencyCode="EUR" AmountBeforeTax="480.00" AmountAfterTax="528.00"></Total>
</ResGlobalInfo>
```

{% endtab %}

{% tab title="RoomStay Level" %}
Example of a reservation with a service linked to the **RoomStay**.\
ServiceRPH present within `<RoomStay>`.\
Service cost is **included** in the **RoomStay Total** and **ResGlobalInfo Total.**\
Service cost is **not included** in the **RoomRate Base** and **RoomRate Total.**

```xml
<RoomStays>
    <RoomStay>
        <RoomTypes>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomTypes>
        <RatePlans>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RatePlans>
        <RoomRates>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomRates>
        <ServiceRPHs>
            <ServiceRPH RPH="1"/>
        </ServiceRPHs>
        <!-- ... other elements and attributes have been omitted for brevity ... -->
        <Total AmountBeforeTax="457.50" AmountAfterTax="503.25" CurrencyCode="EUR"></Total>
    </RoomStay>
</RoomStays>
<Services>
    <Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="1" Quantity="1" ID="12346">
        <Price>
            <Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="EUR"/>
            <Total AmountBeforeTax="7.50" AmountAfterTax="8.25" CurrencyCode="EUR"/>
            <RateDescription>
                <Text>Extra person charge EUR 2.50 per day for cot</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-10-05" End="2025-10-08"/>
        </ServiceDetails>
    </Service>
</Services>
<ResGlobalInfo>
    <!-- ... other elements and attributes have been omitted for brevity ... -->
    <Total CurrencyCode="EUR" AmountBeforeTax="457.50" AmountAfterTax="503.25""></Total>
</ResGlobalInfo>
```

{% endtab %}

{% tab title="Reservation Level" %}
Example of a reservation with a service linked to the entire Reservation.\
**No ServiceRPH link.**\
Service cost is **included** in the **ResGlobalInfo Total.**\
Service cost is **not included** in the **RoomRate Base, RoomRate Total and RoomStay Total.**

```xml
<RoomStays>
    <RoomStay>
        <RoomTypes>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomTypes>
        <RatePlans>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RatePlans>
        <RoomRates>
            <RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
                <Rates>
                    <!-- ... other elements and attributes have been omitted for brevity ... -->
                    <Total AmountBeforeTax="450.00" AmountAfterTax="495.00" CurrencyCode="EUR"/>
                </Rates>
            </RoomRate>
        </RoomRates>
        <!-- ... other elements and attributes have been omitted for brevity ... -->
        <Total AmountBeforeTax="450.00" AmountAfterTax="495.00" CurrencyCode="EUR"></Total>
    </RoomStay>
</RoomStays>
<Services>
    <Service ServiceInventoryCode="OTHER" Inclusive="true" Quantity="1" ID="12346">
        <Price>
            <Base AmountBeforeTax="10.00" AmountAfterTax="11.00" CurrencyCode="EUR"/>
            <Total AmountBeforeTax="30.00" AmountAfterTax="33.00" CurrencyCode="EUR"/>
            <RateDescription>
                <Text>Parking for 1 vehicle per night</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-10-05" End="2025-10-08"/>
        </ServiceDetails>
    </Service>
</Services>
<ResGlobalInfo>
    <!-- ... other elements and attributes have been omitted for brevity ... -->
    <Total CurrencyCode="EUR" AmountBeforeTax="480.00" AmountAfterTax="528.00"></Total>
</ResGlobalInfo>
```

{% endtab %}

{% tab title="Use of TimeSpan" %}
**TimeSpan** is used to show the date range or dates the service applies.\
You will use the `@Start` and `@End` dates to show the date range

**Service applied for the first 2 nights in a 4 night reservation:**

```xml
<RoomStays>
    <RoomStay>
        <RoomTypes>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomTypes>
        <RatePlans>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RatePlans>
        <RoomRates>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomRates>
        <GuestCounts>
            <GuestCount AgeQualifyingCode="10" Count="2"/>
        </GuestCounts>
        <TimeSpan Start="2025-03-12" End="2025-03-16"/>
        <Total AmountAfterTax="520.00" CurrencyCode="AUD"></Total>
        <BasicPropertyInfo HotelCode="HTL1" HotelName="The Beach Side Hotel"/>
        <ServiceRPHs>
            <ServiceRPH RPH="1"/>
        </ServiceRPHs>
        <ResGuestRPHs>
            <ResGuestRPH RPH="1"/>
        </ResGuestRPHs>
    </RoomStay>
</RoomStays>
<Services>
    <Service Inclusive="true" ServiceInventoryCode="OTHER" Quantity="2" ServiceRPH="1">
        <Price>
            <Total AmountAfterTax="20.00" CurrencyCode="AUD"/>
            <RateDescription>
                <Text>Breakfast</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-03-12" End="2025-03-13"/>
        </ServiceDetails>	
    </Service>
</Services>
<ResGuests>
    <!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGuest>
</ResGuests>
<ResGlobalInfo>
    <!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGlobalInfo>
```

**Service applied for different nights in a 4 night reservation:**

TimeSpan can only be used once in a Service node. In this case, you will send 2 Service nodes to indicate the 2 service dates.

```xml
<RoomStays>
    <RoomStay>
        <RoomTypes>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomTypes>
        <RatePlans>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RatePlans>
        <RoomRates>
            <!-- ... other elements and attributes have been omitted for brevity ... -->
        </RoomRates>
        <GuestCounts>
            <GuestCount AgeQualifyingCode="10" Count="2"/>
        </GuestCounts>
        <TimeSpan Start="2025-03-12" End="2025-03-16"/>
        <Total AmountAfterTax="520.00" CurrencyCode="AUD"></Total>
        <BasicPropertyInfo HotelCode="HTL1" HotelName="The Beach Side Hotel"/>
        <ServiceRPHs>
            <ServiceRPH RPH="1"/>
            <ServiceRPH RPH="2"/>
        </ServiceRPHs>
        <ResGuestRPHs>
            <ResGuestRPH RPH="1"/>
        </ResGuestRPHs>
    </RoomStay>
</RoomStays>
<Services>
    <Service Inclusive="true" ServiceInventoryCode="OTHER" Quantity="1" ServiceRPH="1">
        <Price>
            <Total AmountAfterTax="10.00" CurrencyCode="AUD"/>
            <RateDescription>
                <Text>Parking 1st night</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-03-12" End="2025-03-12"/>
        </ServiceDetails>	
    </Service>
    <Service Inclusive="true" ServiceInventoryCode="OTHER" Quantity="1" ServiceRPH="2">
        <Price>
            <Total AmountAfterTax="10.00" CurrencyCode="AUD"/>
            <RateDescription>
                <Text>Parking last night</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-03-15" End="2025-03-15"/>
        </ServiceDetails>	
    </Service>
</Services>
<ResGuests>
    <!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGuest>
</ResGuests>
<ResGlobalInfo>
    <!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGlobalInfo>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="262">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Services</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains service details provided to guests.</td></tr><tr><td><code>Service</code></td><td>Element</td><td align="center">1..n</td><td>Represents a non-room product provided to guests.</td></tr><tr><td><code>@ServiceInventoryCode</code></td><td>String</td><td align="center">1</td><td>Identifier code for the service. Refer to <a href="/pages/CiYdiVL1WUiiuWGcKNmx">Service and Extra Charge</a>. Use this list as a guide to code your extras/services. You can use additional codes not on the list such as PARKING or your own service identifier codes generated in your system.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Reference ID for the extra/service provided by the source booking channel.</td></tr><tr><td><code>@ServiceRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>Service</code> to a <code>RoomStay</code> or <code>RoomRate</code>. <code>ServiceRPH</code> absence indicates a <code>HotelReservation</code> level charge.</td></tr><tr><td><code>@Inclusive</code></td><td>Boolean</td><td align="center">1</td><td>Must be set to <code>TRUE</code>, as SiteMinder reports totals as inclusive of charges and extras.</td></tr><tr><td><code>@Quantity</code></td><td>Integer</td><td align="center">1</td><td>Number of units included in the charge. This value does not affect the total amount.</td></tr><tr><td><code>Price</code></td><td>Element</td><td align="center">0..1</td><td>Container for pricing details of the service.</td></tr><tr><td><code>Base</code></td><td>Element</td><td align="center">0..1</td><td>Base amount charged for the service.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a detailed description of the tax.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>Container for the total amount of the service.</td></tr><tr><td><code>@CurrencyCode</code></td><td></td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Code</code></td><td></td><td align="center">1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Percentage</code></td><td>Decimal</td><td align="center">0..1</td><td>Percentage rate of the applied tax.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>TaxDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a detailed description of the tax.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>Text description of the tax.</td></tr><tr><td><code>RateDescription</code></td><td>Element</td><td align="center">0..1</td><td>Container for a description of the rate applied to the service.</td></tr><tr><td><code>Text</code></td><td>Element</td><td align="center">1</td><td>A text description of the service/extra.</td></tr><tr><td><code>ServiceDetails</code></td><td>Element</td><td align="center">0..1</td><td>Container for additional service details.</td></tr><tr><td><code>TimeSpan</code></td><td>Element</td><td align="center">1</td><td>Contains the time span for which the service is provided.</td></tr><tr><td><code>@Start</code></td><td>Date</td><td align="center">0..1</td><td>Start date of service.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>@End</code></td><td>Date</td><td align="center">0..1</td><td>Last date of service.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr></tbody></table>

### ResGuests

**Guest vs Customer Distinction:**

* **Guests (`ResGuest`):** People staying in the rooms (sent at `RoomStay` level via `ResGuestRPH`)
* **Customer (`Profile ProfileType="1"` in `ResGlobalInfo`):** Person who made the booking or primary contact

These can be the same person or different people.

**Linking Guests to RoomStays:** Using `ResGuestRPH` to link guests to specific RoomStays is optional but recommended because:

* Hotels value knowing which guest is in which room
* Some PMS systems require guest-to-room mapping for proper processing
* Improves data accuracy for multi-room bookings

**Minimum Requirements:**

* At least one guest profile must be provided
* For multi-room bookings, you can send one guest or multiple guests
* If you cannot link guests to rooms, send at least the primary guest

```xml
<ResGuests>
	<ResGuest ResGuestRPH="1" ArrivalTime="14:00:00" PrimaryIndicator="1">
		<Profiles>
			<ProfileInfo>
				<Profile ProfileType="1">
					<Customer>
						<PersonName>
							<NamePrefix>Mr</NamePrefix>
							<GivenName>John</GivenName>
							<Surname>Smith</Surname>
						</PersonName>
						<Telephone PhoneNumber="+61123456789"/>
						<Email>test@siteminder.com</Email>
						<Address>
							<AddressLine>200 George St</AddressLine>
							<AddressLine>Level 3</AddressLine>
							<CityName>Sydney</CityName>
							<PostalCode>2000</PostalCode>
							<StateProv>NSW</StateProv>
							<CountryName>Australia</CountryName>
						</Address>
						<CustLoyalty ProgramID="LoyaltyProgramName" MembershipID="123456789" ExpireDate="2020-12-31"/>
						<Document DocID="987654321P" DocType="5" DocHolderNationality="AU" BirthDate="1996-10-05" Gender="Male" BirthCountry="AU" BirthPlace="AU" EffectiveDate="2015-10-05" ExpireDate="2025-10-05" DocIssueAuthority="The Australian Passport Office" DocIssueLocation="Sydney" DocIssueStateProv="NSW" DocIssueCountry="?">
							<DocHolderName>John Smith</DocHolderName>
						</Document>
					</Customer>
				</Profile>
			</ProfileInfo>
		</Profiles>
	</ResGuest>
	<!-- Additional ResGuest elements -->
</ResGuests>
```

<table><thead><tr><th width="260">Element / @Attribute</th><th width="112">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGuests</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the guests for the reservation.</td></tr><tr><td><code>ResGuest</code></td><td>Element</td><td align="center">1..n</td><td>Contains the specific guest details.</td></tr><tr><td><code>@ResGuestRPH</code></td><td>Integer</td><td align="center">0..1</td><td>Links the <code>ResGuest</code> to <code>RoomStay</code>. Find the links in <a href="#resguestrphs">ResGuestRPHs</a>.</td></tr><tr><td><code>@PrimaryIndicator</code></td><td>Boolean</td><td align="center">0..1</td><td><p>Indicates the primary guest on a reservation:<br><code>1</code> primary guest</p><p><code>0</code> secondary guests</p></td></tr><tr><td><code>@ArrivalTime</code></td><td>Time</td><td align="center">0..1</td><td>Arrival time of the guest.<br>Must use <code>hh:mm:ss</code> format.</td></tr><tr><td><strong><code>Profiles</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the guest profile information.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td align="center">1</td><td>Contains the profile information for the guest.</td></tr><tr><td><code>Profile</code></td><td>Element</td><td align="center">1</td><td>Contains detailed customer profile information.</td></tr><tr><td><code>@ProfileType</code></td><td>Integer</td><td align="center">1</td><td>Must be set to <code>1</code> (Customer).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td align="center">1</td><td>Contains detailed guest information.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">1</td><td>Contains the name information for the guest.</td></tr><tr><td><code>NamePrefix</code></td><td>Element</td><td align="center">0..1</td><td>Title of the guest (e.g., Mr., Mrs., Dr.).</td></tr><tr><td><code>GivenName</code></td><td>Element</td><td align="center">1</td><td>First name of the guest.</td></tr><tr><td><code>Surname</code></td><td>Element</td><td align="center">1</td><td>Last name of the guest.</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..1</td><td>Contains telephone information related to the guest.</td></tr><tr><td><code>@PhoneNumber</code></td><td>String</td><td align="center">1</td><td>Contains the actual number (maximum 32 characters).</td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..1</td><td>Contact email address.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..1</td><td>Address information of the guest.</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td align="center">0..2</td><td>Address lines for the guest.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td align="center">0..1</td><td>City of residence.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td align="center">0..1</td><td>Postal code.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td align="center">0..1</td><td>State or province name.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td align="center">0..1</td><td>Country name (maximum 64 characters).</td></tr><tr><td><strong><code>CustLoyalty</code></strong></td><td>Element</td><td align="center">0..n</td><td>Contains loyalty information for the guest.</td></tr><tr><td><code>@ProgramID</code></td><td>String</td><td align="center">1</td><td>Defined membership program name or ID applicable to the program.</td></tr><tr><td><code>@MembershipID</code></td><td>String</td><td align="center">1</td><td>Account identification number for this particular member in this particular program.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Expiry date for this particular membership record in this particular program.</td></tr><tr><td><strong><code>Document</code></strong></td><td>Element</td><td align="center">0..1</td><td>Detailed document information for the guest.</td></tr><tr><td><code>@BirthCountry</code></td><td>String</td><td align="center">0..1</td><td>Birth country of the document holder. Use <code>ISO 3166 A-2</code> country codes.</td></tr><tr><td><code>@BirthDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the date of birth as indicated in the document. Use ISO 8601 date format.</td></tr><tr><td><code>@BirthPlace</code></td><td>String</td><td align="center">0..1</td><td>Specifies the birth place of the document holder (e.g., city, state, county, province).<br><strong>Maximum 64 characters.</strong></td></tr><tr><td><code>@DocHolderNationality</code></td><td>String</td><td align="center">0..1</td><td>Country of nationality of the document holder. Use <code>ISO 3166 A-2</code> country codes.</td></tr><tr><td><code>@DocID</code></td><td>String</td><td align="center">1</td><td>Unique number assigned by authorities to the document.</td></tr><tr><td><code>@DocIssueAuthority</code></td><td>String</td><td align="center">0..1</td><td>Indicates the group or association that granted the document.<br><strong>Maximum 64 characters.</strong></td></tr><tr><td><code>@DocIssueCountry</code></td><td>String</td><td align="center">0..1</td><td>Country where the document was issued. Use <code>ISO 3166 A-2</code> country codes.</td></tr><tr><td><code>@DocIssueLocation</code></td><td>String</td><td align="center">0..1</td><td>Indicates the location where the document was issued.<br><strong>Maximum 64 characters.</strong></td></tr><tr><td><code>@DocIssueStateProv</code></td><td>String</td><td align="center">0..1</td><td>State or Province where the document was issued <strong>(2-8 characters)</strong>.</td></tr><tr><td><code>@DocType</code></td><td>String</td><td align="center">1</td><td>Indicates the type of document. Refer to <a href="/pages/mZ5VhSA8q98aQtJqawjh">Document Type Code (DOC)</a>.</td></tr><tr><td><code>@EffectiveDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the starting date.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>@ExpireDate</code></td><td>Date</td><td align="center">0..1</td><td>Indicates the ending date.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>@Gender</code></td><td>String</td><td align="center">0..1</td><td><p>Identifies the gender:</p><p><code>Female</code></p><p><code>Male</code></p><p><code>Unknown</code></p></td></tr><tr><td><code>DocHolderName</code></td><td>Element</td><td align="center">0..1</td><td>The name of the document holder in unformatted text (Mr. Sam Jones). If no <code>DocHolderName</code> is included, the guest name fields will be assumed as the holder name.</td></tr></tbody></table>

### **ArrivalTransport**

```xml
<ArrivalTransport>
	<TransportInfo Type="Air" ID="QF123" Time="2024-10-05T13:00:00"/>
</ArrivalTransport>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ArrivalTransport</code></strong></td><td>Element</td><td align="center">0..1</td><td>Details about transport to the destination.</td></tr><tr><td><code>TransportInfo</code></td><td>Element</td><td align="center">1</td><td>Contains transport mode details used by the guest for arrival.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">0..1</td><td>Type of transport used for arrival, provided by the booking channel.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Transport provider's ID for the mode of transportation (e.g., Flight Number QF123).</td></tr><tr><td><code>@Time</code></td><td>DateTime</td><td align="center">0..1</td><td>Arrival time at the destination.</td></tr></tbody></table>

### **DepartureTransport**

```xml
<DepartureTransport>
	<TransportInfo Type="Air" ID="QF321" Time="2024-10-08T17:00:00"/>
</DepartureTransport>
```

<table><thead><tr><th width="256">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>DepartureTransport</code></strong></td><td>Element</td><td align="center">0..1</td><td>Details about transport from the destination.</td></tr><tr><td><code>TransportInfo</code></td><td>Element</td><td align="center">1</td><td>Contains transport mode details used by the guest for departure.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">0..1</td><td>Type of transport used for departure, provided by the booking channel.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">0..1</td><td>Transport provider's ID for the mode of transportation (e.g., Flight Number QF123).</td></tr><tr><td><code>@Time</code></td><td>DateTime</td><td align="center">0..1</td><td>Departure time from the destination.</td></tr></tbody></table>

### ResGlobalInfo

```xml
<ResGlobalInfo>
	<HotelReservationIDs>
		<HotelReservationID ResID_Type="14" ResID_Value="123456789"/>
	</HotelReservationIDs>
	<!-- ... other elements and attributes have been omitted for brevity ... -->
</ResGlobalInfo>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>ResGlobalInfo</code></strong></td><td>Element</td><td align="center">1</td><td>Contains global information about the reservation.</td></tr><tr><td><code>HotelReservationIDs</code></td><td>Element</td><td align="center">0..1</td><td>Contains the <code>HotelReservationID</code>.</td></tr><tr><td><code>HotelReservationID</code></td><td>Element</td><td align="center">1</td><td>Reference number/string or PNR as supplied by the booking channel.</td></tr><tr><td><code>@ResID_Type</code></td><td>String</td><td align="center">1</td><td>Must be set to <code>14</code> (Travel Agent PNR).</td></tr><tr><td><code>@ResID_Value</code></td><td>String</td><td align="center">1</td><td>Actual reference number/string supplied by the booking channel (maximum 64 characters).</td></tr></tbody></table>

### **ResComments**

```xml
<Comments>
	<Comment>
		<Text>See the reservation comments here</Text>
	</Comment>
	<!-- Additional Comment elements -->
</Comments>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Comments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Contains comment for the reservation.</td></tr><tr><td><code>Comment</code></td><td>Element</td><td align="center">1..n</td><td>Holds the actual comment.</td></tr><tr><td><code>Text</code></td><td>String</td><td align="center">1</td><td><p>Content of the comment.</p><p>PCI sensitive data is prohibited.</p></td></tr></tbody></table>

### ReservationTotal

**Discount Handling:** SiteConnect does not have a specific discount field. Discounts should be applied to the total amounts in:

* Reservation Total (`ResGlobalInfo/Total`)
* RoomStay Total
* Daily Rate Totals

**Best practice:** Include a comment explaining the discount applied (e.g., "Early Bird 15% discount applied").

```xml
<Total CurrencyCode="EUR" AmountBeforeTax="558.00" AmountAfterTax="620.00">
	<Taxes>
		<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
	</Taxes>
	<TPA_Extensions>
		<Total includesCommission="true"/>
	</TPA_Extensions>
</Total>
```

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Total</code></strong></td><td>Element</td><td align="center">1</td><td>Total amount for the reservation. This includes all <code>RoomStays</code> and any additional fees or charges that apply.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use <code>ISO 4217</code> currency codes.</td></tr><tr><td><code>@AmountBeforeTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>@AmountAfterTax</code></td><td>Decimal</td><td align="center">0..1</td><td>At least one of <code>AmountAfterTax</code> or <code>AmountBeforeTax</code> must be set.</td></tr><tr><td><code>Taxes</code></td><td>Element</td><td align="center">0..1</td><td>Contains details of the taxes applied.</td></tr><tr><td><code>Tax</code></td><td>Element</td><td align="center">1</td><td>Contains specific tax information.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">0..1</td><td><p>Indicates whether the tax is:</p><p><code>inclusive</code></p><p><code>exclusive</code></p><p><code>cumulative</code></p></td></tr><tr><td><code>@Code</code></td><td>String</td><td align="center">0..1</td><td>Indicates the specific tax or fee that is being transferred. Refer to <a href="/pages/25577kjBcjKCgYHcsgBY">Fee Tax Type (FTT)</a>.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">0..1</td><td>Tax amount applied.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Use ISO 4217 currency codes.</td></tr><tr><td><code>TPA_Extensions</code></td><td>Element</td><td align="center">0..1</td><td>Indicates if the reservation is using the <code>Net</code> amount or <code>Gross</code> amount. Required if the booking channel uses the <code>Commission Percentage</code> feature.</td></tr><tr><td><code>Total</code></td><td>Element</td><td align="center">1</td><td>Contains the <code>includesCommission</code> information.</td></tr><tr><td><code>@includesCommission</code></td><td>Boolean</td><td align="center">1</td><td><p><code>false</code> uses Net Amount.</p><p><code>true</code> uses Gross Amount.</p><p>When <code>includesCommission</code> is set, all RoomRate and RoomStay level totals will be considered as Net or Gross amounts based on this value.</p></td></tr></tbody></table>

### **Guarantee**

**Virtual Credit Cards (VCC)**: If a booking channel supports Virtual Credit Cards (VCC), it is essential to ensure that VCC details are updated in accordance with any reservation modifications or cancellations. This is critical for maintaining accurate payment information and ensuring that charges align with the updated booking details, especially in cases where reservations are amended or canceled after the initial transaction.

In the event of a cancellation, the **TPA\_Extensions** section must either be removed entirely, or the **VCCCurrentBalance** should be set to `0.00`. Alternatively, the **VCCCurrentBalance** can be updated to reflect the amount permitted by the cancellation policy, indicating how much the hotel can still charge from the VCC for the canceled reservation.

{% tabs %}
{% tab title="Virtual Credit Card" %}

```xml
<Guarantee>
	<GuaranteesAccepted>
		<GuaranteeAccepted>
			<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
				<CardHolderName>John Smith</CardHolderName>
				<TPA_Extensions>
					<VirtualCreditCard isVCC="true" VCCActivationDate="2024-09-05" VCCCurrencyCode="EUR" VCCCurrentBalance="620.00" VCCDeactivationDate="2024-10-08"/>
				</TPA_Extensions>
			</PaymentCard>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
</Guarantee>
```

{% endtab %}

{% tab title="Credit Card " %}

```xml
<Guarantee>
	<GuaranteesAccepted>
		<GuaranteeAccepted>
			<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
				<CardHolderName>John Smith</CardHolderName>
			</PaymentCard>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
</Guarantee>
```

{% endtab %}

{% tab title="ThreeDomainSecurity" %}

```xml
<Guarantee>
	<GuaranteesAccepted>
		<GuaranteeAccepted>
			<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
				<CardHolderName>John Smith</CardHolderName>
				<ThreeDomainSecurity>
					<Results ThreeDSVersion="1.0.2" XID="z9UKb06xLziZMOXBEmWSVA1kwG0=" CAVV="MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=" ECI="05" />
				</ThreeDomainSecurity>
			</PaymentCard>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
</Guarantee>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="274">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Guarantee</code></strong></td><td>Element</td><td align="center">0..1</td><td>Guarantee provided with the reservation. Used if no deposit is paid for the reservation.</td></tr><tr><td><code>GuaranteesAccepted</code></td><td>Element</td><td align="center">1</td><td>Contains the details of accepted guarantees.</td></tr><tr><td><code>GuaranteeAccepted</code></td><td>Element</td><td align="center">1</td><td>Specific details of the accepted guarantee.</td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">1</td><td>Details of the payment card used for the guarantee.</td></tr><tr><td><code>@CardType</code></td><td>String</td><td align="center">0..1</td><td>Must be set to <code>1</code> (Credit Card).</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">1</td><td>2-character code of the credit card issuer. Refer to <a href="/pages/Iqs1qAbBKAcBqhyyZHQt">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@CardNumber</code></td><td>String</td><td align="center">0..1</td><td><p>Actual credit card number. Length must not exceed 19 digits.</p><p>Required if <code>ExpireDate</code> or <code>ThreeDomainSecurity</code> is provided.</p></td></tr><tr><td><code>@SeriesCode</code></td><td>String</td><td align="center">0..1</td><td>Security number of the card. Only passed through if the booking channel uses <strong>Reservation Notification Email</strong>. Not stored for PCI compliance.</td></tr><tr><td><code>@ExpireDate</code></td><td>String</td><td align="center">0..1</td><td>Expiry date of the credit card (format <code>MMyy</code>).<br>Required if <code>CardNumber</code> is provided.</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td align="center">0..1</td><td>Name of the cardholder.</td></tr><tr><td><code>ThreeDomainSecurity</code></td><td>Element</td><td align="center">0..1</td><td>Contains 3DS (Three Domain Security) transaction details.</td></tr><tr><td><code>Results</code></td><td>Element</td><td align="center">1</td><td>Transaction results.</td></tr><tr><td><code>@ThreeDSVersion</code></td><td>String</td><td align="center">1</td><td>3DS version used for authentication.</td></tr><tr><td><code>@XID</code></td><td>String</td><td align="center">0..1</td><td><p>Transaction identifier resulting from authentication processing.</p><p>When <code>ThreeDSVersion</code> = 1.x.x the transaction identifier MUST be provided in the <code>@XID</code> attribute.</p></td></tr><tr><td><code>@DSTransactionID</code></td><td>String</td><td align="center">0..1</td><td><p>Unique transaction identifier assigned by the Directory Server (DS) to identify a single transaction.</p><p>When <code>ThreeDSVersion</code> = 2.x.x the transaction identifier MUST be provided in the <code>@DSTransactionID</code> attribute.</p></td></tr><tr><td><code>@CAVV</code></td><td>String</td><td align="center">1</td><td>Cardholder Authentication Verification Value (CAVV); Authentication Verification Value (AVV); Universal Cardholder Authentication Field (UCAF)</td></tr><tr><td><code>@ECI</code></td><td>String</td><td align="center">1</td><td>Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/strong-customer-authentication-codes#electronic-commerce-indicator">Electronic Commerce Indicator</a>.</td></tr><tr><td><code>@PAResStatus</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transactions-status-result-identifier">Transactions Status Result Identifier</a>.</td></tr><tr><td><code>@SignatureVerification</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transaction-signature-status">Transaction Signature Status</a>.</td></tr><tr><td><code>@Enrolled</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/siteminder-apis/additional-resources/reference-tables/strong-customer-authentication-codes#status-of-authentication">Status of Authentication</a>.</td></tr><tr><td><code>TPA_Extensions</code></td><td>Element</td><td align="center">0..1</td><td>Additional elements for the transaction.</td></tr><tr><td><code>VirtualCreditCard</code></td><td>Element</td><td align="center">1</td><td>Denotes that the payment card is a virtual credit card.</td></tr><tr><td><code>@isVCC</code></td><td>Boolean</td><td align="center">1</td><td>Must be set to <code>true</code>.</td></tr><tr><td><code>@VCCActivationDate</code></td><td>Date</td><td align="center">0..1</td><td>Date from when the card can be charged.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>@VCCDeactivationDate</code></td><td>Date</td><td align="center">0..1</td><td>Date from when the card is no longer chargeable.<br>Must use <code>YYYY-MM-DD</code> format.</td></tr><tr><td><code>@VCCCurrentBalance</code></td><td>Decimal</td><td align="center">0..1</td><td>Total amount that can be charged to the card. If the reservation is modified or canceled, an updated balance should be sent indicating the new total amount that can be charged to the card. If the amount changes to <code>0</code> as a result of cancellation, the cancellation should be sent with a <code>0</code> balance.</td></tr><tr><td><code>@VCCCurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Must be included if there is <code>@VCCCurrentBalance</code>. Use <code>ISO 4217</code> currency codes.</td></tr></tbody></table>

### **DepositPayments**

**Virtual Credit Cards (VCC)**: If a booking channel supports Virtual Credit Cards (VCC), it is essential to ensure that VCC details are updated in accordance with any reservation modifications or cancellations. This is critical for maintaining accurate payment information and ensuring that charges align with the updated booking details, especially in cases where reservations are amended or canceled after the initial transaction.

In the event of a cancellation, the **TPA\_Extensions** section must either be removed entirely, or the **VCCCurrentBalance** should be set to `0.00`. Alternatively, the **VCCCurrentBalance** can be updated to reflect the amount permitted by the cancellation policy, indicating how much the hotel can still charge from the VCC for the canceled reservation.

{% tabs %}
{% tab title="Virtual Credit Card" %}
{% code expandable="true" %}

```xml
<DepositPayments>
	<GuaranteePayment>
		<AcceptedPayments>
			<AcceptedPayment>
				<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
					<CardHolderName>John Smith</CardHolderName>
					<TPA_Extensions>
						<VirtualCreditCard isVCC="true" VCCActivationDate="2021-08-23" VCCDeactivationDate="2021-09-19" VCCCurrentBalance="100.00" VCCCurrencyCode="EUR"/>
					</TPA_Extensions>
				</PaymentCard>
			</AcceptedPayment>
		</AcceptedPayments>
		<AmountPercent Amount="90.00" CurrencyCode="EUR"/>
	</GuaranteePayment>
</DepositPayments>
```

{% endcode %}
{% endtab %}

{% tab title="Credit Card " %}
{% code expandable="true" %}

```xml
<DepositPayments>
	<GuaranteePayment>
		<AcceptedPayments>
			<AcceptedPayment>
				<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
					<CardHolderName>John Smith</CardHolderName>
				</PaymentCard>
			</AcceptedPayment>
		</AcceptedPayments>
		<AmountPercent Amount="90.00" CurrencyCode="EUR"/>
	</GuaranteePayment>
</DepositPayments>
```

{% endcode %}
{% endtab %}

{% tab title="ThreeDomainSecurity" %}
{% code expandable="true" %}

```xml
<DepositPayments>
	<GuaranteePayment>
		<AcceptedPayments>
			<AcceptedPayment>
				<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
					<CardHolderName>John Smith</CardHolderName>
					<ThreeDomainSecurity>
						<Results ThreeDSVersion="1.0.2" XID="z9UKb06xLziZMOXBEmWSVA1kwG0=" CAVV="MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=" ECI="05" />
					</ThreeDomainSecurity>
				</PaymentCard>
			</AcceptedPayment>
		</AcceptedPayments>
		<AmountPercent Amount="90.00" CurrencyCode="EUR"/>
	</GuaranteePayment>
</DepositPayments>
```

{% endcode %}
{% endtab %}

{% tab title="Deposit Only" %}

```xml
<DepositPayments>
	<GuaranteePayment>
		<AmountPercent Amount="90.00" CurrencyCode="EUR"/>
	</GuaranteePayment>
</DepositPayments>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="270">Element / @Attribute</th><th width="112">Type</th><th width="58" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>DepositPayments</code></strong></td><td>Element</td><td align="center">0..1</td><td>Deposit provided with the reservation.</td></tr><tr><td><code>GuaranteePayment</code></td><td>Element</td><td align="center">1</td><td>Contains details of the payment guarantee for the reservation.</td></tr><tr><td><code>AcceptedPayments</code></td><td>Element</td><td align="center">0..1</td><td>Contains the accepted payment methods.</td></tr><tr><td><code>AcceptedPayment</code></td><td>Element</td><td align="center">1</td><td>Specific payment method accepted.</td></tr><tr><td><code>PaymentCard</code></td><td>Element</td><td align="center">1</td><td>Details of the payment card used for the guarantee.</td></tr><tr><td><code>@CardType</code></td><td>String</td><td align="center">0..1</td><td>Must be set to <code>1</code> (Credit Card).</td></tr><tr><td><code>@CardCode</code></td><td>String</td><td align="center">1</td><td>2-character code of the credit card issuer. Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/payment-card-provider-codes">Payment Card Provider Codes</a>.</td></tr><tr><td><code>@CardNumber</code></td><td>String</td><td align="center">0..1</td><td>Actual credit card number. Length must not exceed 19 digits.</td></tr><tr><td><code>@SeriesCode</code></td><td>String</td><td align="center">0..1</td><td>Security number of the card. Only passed through if the booking channel uses <strong>Reservation Notification Email</strong>. Not stored for PCI compliance.</td></tr><tr><td><code>@ExpireDate</code></td><td>String</td><td align="center">0..1</td><td>Expiry date of the credit card (format <code>MMyy</code>).</td></tr><tr><td><code>CardHolderName</code></td><td>Element</td><td align="center">0..1</td><td>Name of the cardholder.</td></tr><tr><td><code>ThreeDomainSecurity</code></td><td>Element</td><td align="center">0..1</td><td>Contains 3DS (Three Domain Security) transaction details.</td></tr><tr><td><code>Results</code></td><td>Element</td><td align="center">1</td><td>Transaction results.</td></tr><tr><td><code>@ThreeDSVersion</code></td><td>Element</td><td align="center">1</td><td>3DS version used for authentication.</td></tr><tr><td><code>@XID</code></td><td>String</td><td align="center">0..1</td><td><p>Transaction identifier resulting from authentication processing.</p><p>When <code>ThreeDSVersion</code> = 1.x.x the transaction identifier MUST be provided in the <code>@XID</code> attribute.</p></td></tr><tr><td><code>@DSTransactionID</code></td><td>String</td><td align="center">0..1</td><td><p>Unique transaction identifier assigned by the Directory Server (DS) to identify a single transaction.</p><p>When <code>ThreeDSVersion</code> = 2.x.x the transaction identifier MUST be provided in the <code>@DSTransactionID</code> attribute.</p></td></tr><tr><td><code>@CAVV</code></td><td>String</td><td align="center">0..1</td><td>Cardholder Authentication Verification Value (CAVV); Authentication Verification Value (AVV); Universal Cardholder Authentication Field (UCAF)</td></tr><tr><td><code>@ECI</code></td><td>String</td><td align="center">1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#electronic-commerce-indicator">Electronic Commerce Indicator</a>.</td></tr><tr><td><code>@PAResStatus</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transactions-status-result-identifier">Transactions Status Result Identifier</a>.</td></tr><tr><td><code>@SignatureVerification</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#transaction-signature-status">Transaction Signature Status</a>.</td></tr><tr><td><code>@Enrolled</code></td><td>String</td><td align="center">0..1</td><td>Refer to <a href="https://developer.siteminder.com/sm-apis/additional-resources/reference-tables/strong-customer-authentication-codes#status-of-authentication">Status of Authentication</a>.</td></tr><tr><td><code>TPA_Extensions</code></td><td>Element</td><td align="center">0..1</td><td>Additional elements for the transaction.</td></tr><tr><td><code>VirtualCreditCard</code></td><td>Element</td><td align="center">1</td><td>Denotes that the payment card is a virtual credit card.</td></tr><tr><td><code>@isVCC</code></td><td>Boolean</td><td align="center">1</td><td>Must be set to <code>true</code>.</td></tr><tr><td><code>@VCCActivationDate</code></td><td>Date</td><td align="center">0..1</td><td>Date from when the card can be charged.</td></tr><tr><td><code>@VCCDeactivationDate</code></td><td>Date</td><td align="center">0..1</td><td>Date from when the card is no longer chargeable.</td></tr><tr><td><code>@VCCCurrentBalance</code></td><td>Decimal</td><td align="center">0..1</td><td>Total amount that can be charged to the card. If the reservation is modified or canceled, an updated balance should be sent indicating the new total amount that can be charged to the card. If the amount changes to <code>0</code> as a result of cancellation, the cancellation should be sent with a <code>0</code> balance.</td></tr><tr><td><code>@VCCCurrencyCode</code></td><td>String</td><td align="center">0..1</td><td>Must be included if there is <code>@VCCCurrentBalance</code>. Use ISO 4217 currency codes.</td></tr><tr><td><code>AmountPercent</code></td><td>Element</td><td align="center">1</td><td>Mandatory when something is passed in the <code>DepositPayment</code> element.</td></tr><tr><td><code>@Amount</code></td><td>Decimal</td><td align="center">1</td><td>Amount charged as deposit.</td></tr><tr><td><code>@CurrencyCode</code></td><td>String</td><td align="center">1</td><td>Use ISO 4217 currency codes.</td></tr></tbody></table>

### Customer / Corporate / TravelAgent

{% tabs %}
{% tab title="Customer" %}
**Customer:** The individual who made the booking and serves as the primary contact for the reservation. This may or may not be the same person as the guest staying in the room.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
	<ProfileInfo>
		<Profile ProfileType="1">
			<Customer>
				<PersonName>
					<NamePrefix>Mr</NamePrefix>
					<GivenName>John</GivenName>
					<Surname>Smith</Surname>
				</PersonName>
				<Telephone PhoneNumber="0266564100"/>
				<Email>johnsmith@mail.com</Email>
				<Address>
					<AddressLine>1 George St</AddressLine>
					<AddressLine>CBD</AddressLine>
					<CityName>Sydney</CityName>
					<PostalCode>2000</PostalCode>
					<StateProv>NSW</StateProv>
					<CountryName>Australia</CountryName>
				</Address>
			</Customer>
		</Profile>
	</ProfileInfo>
	<!-- Additional ProfileInfo elements -->
</Profiles>
```

{% endcode %}
{% endtab %}

{% tab title="Corporate" %}
**Corporate:** The company or organisation associated with the booking, typically where a negotiated corporate rate applies or the reservation is billed to a company account.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
	<ProfileInfo>
		<Profile ProfileType="1">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</Profile>
	</ProfileInfo>
	<ProfileInfo>
		<Profile ProfileType="3">
			<CompanyInfo>
			<UniqueID ID="CORP"/>
				<CompanyName>COMPANY</CompanyName>
				<TelephoneInfo PhoneNumber="0266564101"/>
				<Email>contact@company.com</Email>
				<AddressInfo>
					<AddressLine>3 George St</AddressLine>
					<AddressLine>CBD</AddressLine>
					<CityName>Sydney</CityName>
					<PostalCode>2000</PostalCode>
					<StateProv>NSW</StateProv>
					<CountryName>Australia</CountryName>
				</AddressInfo>
			</CompanyInfo>
		</Profile>
	</ProfileInfo>
	<!-- Additional ProfileInfo element -->
</Profiles>
```

{% endcode %}
{% endtab %}

{% tab title="Travel Agent" %}
**Travel Agent:** The agency or intermediary through which the booking was sourced, typically identified by an IATA or ARC number. The hotel may owe commission to this party for the booking.

{% code overflow="wrap" expandable="true" %}

```xml
<Profiles>
	<ProfileInfo>
		<Profile ProfileType="1">
			<!-- ... other elements and attributes have been omitted for brevity ... -->
		</Profile>
	</ProfileInfo>
	<!-- Additional ProfileInfo element -->
	<ProfileInfo>
		<Profile ProfileType="4">
		<UniqueID ID="56789"/>
			<CompanyInfo>
				<CompanyName>TRAVEL AGENT LTD</CompanyName>
				<TelephoneInfo PhoneNumber="0266564100"/>
				<Email>contact@travelagent.com</Email>
				<AddressInfo>
					<AddressLine>4 George St</AddressLine>
					<AddressLine>CBD</AddressLine>
					<CityName>Sydney</CityName>
					<PostalCode>2000</PostalCode>
					<StateProv>NSW</StateProv>
					<CountryName>Australia</CountryName>
				</AddressInfo>
			</CompanyInfo>
		</Profile>
	</ProfileInfo>
</Profiles>
```

{% endcode %}
{% endtab %}
{% endtabs %}

<table><thead><tr><th width="254">Element / @Attribute</th><th width="112">Type</th><th width="60" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><strong><code>Profiles</code></strong></td><td>Element</td><td align="center">1</td><td>Contains the profiles related to the reservation, including the customer, corporate and/or travel agent.</td></tr><tr><td><code>ProfileInfo</code></td><td>Element</td><td align="center">1..3</td><td>Contains information about the profile type.</td></tr><tr><td><code>Profile</code></td><td>Element</td><td align="center">1</td><td>Contains profile details, such as customer, company, or travel agent information.</td></tr><tr><td><code>@ProfileType</code></td><td>String</td><td align="center">1</td><td><p>Defines the type of profile:</p><p><code>1</code> Customer (mandatory)</p><p><code>3</code> Corporate (optional)</p><p><code>4</code> Travel Agent (optional)</p></td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">0..1</td><td>Only used on <code>ProfileType</code> <code>3</code> (Corporate) and <code>ProfileType</code> <code>4</code> (Travel Agent) to identify the unique ID of the agent.</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Identification number, such as a corporate ID or travel agent ID (e.g., IATA code).</td></tr><tr><td><code>Customer</code></td><td>Element</td><td align="center">1</td><td>Used for <code>ProfileType 1</code> to contain customer details.</td></tr><tr><td><code>PersonName</code></td><td>Element</td><td align="center">1</td><td>Contains the name information for the customer.</td></tr><tr><td><code>NamePrefix</code></td><td>Element</td><td align="center">0..1</td><td>Title of the customer (e.g., Mr., Mrs., Dr.).</td></tr><tr><td><code>GivenName</code></td><td>Element</td><td align="center">1</td><td>First name of the customer.</td></tr><tr><td><code>Surname</code></td><td>Element</td><td align="center">1</td><td>Last name of the customer.</td></tr><tr><td><code>CompanyInfo</code></td><td>Element</td><td align="center">1</td><td>Used for <code>ProfileType 3</code> (Corporate) and <code>ProfileType 4</code> (Travel Agent) to contain company information.</td></tr><tr><td><code>CompanyName</code></td><td>Element</td><td align="center">1</td><td>Name of the company.</td></tr><tr><td><code>Telephone</code></td><td>Element</td><td align="center">0..1</td><td>Contains telephone information related to the profile.</td></tr><tr><td><code>TelephoneInfo</code></td><td>Element</td><td align="center">0..1</td><td>Only used for <code>ProfileType 3</code> (Corporate) and <code>ProfileType 4</code> (Travel Agent)</td></tr><tr><td><code>@PhoneNumber</code></td><td>String</td><td align="center">1</td><td>Contains the actual number (maximum 32 characters).</td></tr><tr><td><code>Email</code></td><td>Element</td><td align="center">0..1</td><td>Contact email address related to the profile.</td></tr><tr><td><code>Address</code></td><td>Element</td><td align="center">0..1</td><td>Address information for the profile.</td></tr><tr><td><code>AddressInfo</code></td><td>Element</td><td align="center">0..1</td><td>Only used for <code>ProfileType 3</code> (Corporate) and <code>ProfileType 4</code> (Travel Agent)</td></tr><tr><td><code>AddressLine</code></td><td>Element</td><td align="center">0..2</td><td>One or more address lines for the profile.</td></tr><tr><td><code>CityName</code></td><td>Element</td><td align="center">0..1</td><td>City of the profile's residence.</td></tr><tr><td><code>PostalCode</code></td><td>Element</td><td align="center">0..1</td><td>Postal code of the profile.</td></tr><tr><td><code>StateProv</code></td><td>Element</td><td align="center">0..1</td><td>State or province of the profile's residence.</td></tr><tr><td><code>CountryName</code></td><td>Element</td><td align="center">0..1</td><td>Country of the profile's residence (maximum 64 characters).</td></tr></tbody></table>

## **2. Confirmation Response**

**Reservation Confirmation and Response Handling**: SiteMinder does not have the authority to allow or deny reservations. The `OTA_HotelResNotifRS` response simply confirms whether SiteMinder has successfully received the reservation delivery message or notification request, indicating `Success` or `Error`. It is important to note that SiteMinder only acknowledges receipt of the reservation message and does not influence the booking process on your end.

{% tabs %}
{% tab title="Success" %}

```xml
<OTA_HotelResNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Success/>
	<HotelReservations>
		<HotelReservation>
			<UniqueID Type="14" ID="123456789"/>
			<ResGlobalInfo>
				<HotelReservationIDs>
					<HotelReservationID ResID_Type="14" ResID_Value="ABC-123456789"/>
				</HotelReservationIDs>
			</ResGlobalInfo>
		</HotelReservation>
	</HotelReservations>
</OTA_HotelResNotifRS>
```

{% endtab %}

{% tab title="Error" %}

```xml
<OTA_HotelResNotifRS
	xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2024-07-06T15:27:41+00:00" Version="1.0">
	<Errors>
		<Error Type="6">Hotel not found for HotelCode=HOTELCODE</Error>
	</Errors>
</OTA_HotelResNotifRS>
```

{% endtab %}
{% endtabs %}

<table><thead><tr><th width="257">Element / @Attribute</th><th width="108">Type</th><th width="62" align="center">M</th><th>Description</th></tr></thead><tbody><tr><td><code>OTA_HotelResNotifRS</code></td><td>Element</td><td align="center">1</td><td>Root element for the response.</td></tr><tr><td><code>@xmlns</code></td><td>String</td><td align="center">1</td><td>Defines the XML namespace for the request. Will be set to <code>http://www.opentravel.org/OTA/2003/05</code></td></tr><tr><td><code>@EchoToken</code></td><td>String</td><td align="center">1</td><td>Unique identifier for the request, used to match requests and responses.</td></tr><tr><td><code>@TimeStamp</code></td><td>DateTime</td><td align="center">1</td><td>Time when the response was generated.</td></tr><tr><td><code>@Version</code></td><td>String</td><td align="center">1</td><td>Specifies the API version. Will be set to <code>1.0</code>.</td></tr><tr><td><code>Success</code></td><td>Element</td><td align="center">0..1</td><td>Indicates successful processing of the request.</td></tr><tr><td><code>HotelReservations</code></td><td>Element</td><td align="center">1</td><td>Contains details of the reservation made.</td></tr><tr><td><code>HotelReservation</code></td><td>Element</td><td align="center">1</td><td>Individual hotel reservation information.</td></tr><tr><td><code>UniqueID</code></td><td>Element</td><td align="center">1</td><td>Unique identifier for the reservation.</td></tr><tr><td><code>@Type</code></td><td>String</td><td align="center">1</td><td>Will be set to <code>14</code> (Reservation).</td></tr><tr><td><code>@ID</code></td><td>String</td><td align="center">1</td><td>Actual confirmation number.</td></tr><tr><td><code>ResGlobalInfo</code></td><td>Element</td><td align="center">1</td><td>Contains global information about the reservation.</td></tr><tr><td><code>HotelReservationIDs</code></td><td>Element</td><td align="center">1</td><td>Contains the <code>HotelReservationID</code>.</td></tr><tr><td><code>HotelReservationID</code></td><td>Element</td><td align="center">1</td><td>Reference number/string or PNR.</td></tr><tr><td><code>@ResID_Type</code></td><td>String</td><td align="center">1</td><td>Will be set to <code>14</code> (Travel Agent PNR).</td></tr><tr><td><code>@ResID_Value</code></td><td>String</td><td align="center">1</td><td>The identifier of the reservation created by SiteMinder.</td></tr><tr><td><code>Errors</code></td><td>Element</td><td align="center">0..1</td><td>Indicates an error occurred during the processing of the request.</td></tr><tr><td><code>Error</code></td><td>Element</td><td align="center">1..n</td><td>Single error information containing free text.</td></tr><tr><td><code>@Type</code></td><td>Integer</td><td align="center">1</td><td>Type of error. Refer to <a href="/pages/eTWh81Gq6djsnm0unSR4">Error Warning Types (EWT)</a>.</td></tr><tr><td><code>@Code</code></td><td>Integer</td><td align="center">0..1</td><td>Code representing the error. Refer to <a href="/pages/4gDxPCSFeyblWHTelhiH">Error Codes (ERR)</a>.</td></tr></tbody></table>

## Reservation XML Samples <a href="#reservation-xml-samples" id="reservation-xml-samples"></a>

<details>

<summary>Maximum Content XML</summary>

This example provides a general XML for a reservation that includes a service at the `RoomStay` level, along with a guarantee using a virtual credit card. This example is designed to demonstrate the structure and key elements for such a booking scenario. Variations of this reservation can be created based on specific requirements, as long as they adhere to the [specifications](https://developer.siteminder.com/siteminder-apis/channels/introduction/siteconnect/api-reference/reservations).

The `<!-- Additional ... elements -->` comments within the XML indicate areas where further elements may be added if needed for other configurations.

```xml
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header>
		<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
			<wsse:UsernameToken>
				<wsse:Username>USERNAME</wsse:Username>
				<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
			</wsse:UsernameToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body>
		<OTA_HotelResNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" ResStatus="Commit" EchoToken="ed8835ff-6198-4f38-b589-3058397f677c" TimeStamp="2026-07-06T15:27:41+00:00" Version="1.0">
			<POS>
				<Source>
					<RequestorID Type="22" ID="ABC"/>
					<BookingChannel Primary="true">
						<CompanyName Code="ABC">Channel Name</CompanyName>
					</BookingChannel>
				</Source>
				<Source>
					<BookingChannel Primary="false">
						<CompanyName Code="CBA">Affiliated Channel</CompanyName>
					</BookingChannel>
				</Source>
			</POS>
			<HotelReservations>
				<HotelReservation CreateDateTime="2026-07-06T15:27:41+00:00" LastModifyDateTime="2026-07-06T15:27:41+00:00">
					<UniqueID Type="14" ID="123456789"/>
					<RoomStays>
						<RoomStay PromotionCode="AUTUNM2024">
							<RoomTypes>
								<RoomType RoomTypeCode="TPL">
									<RoomDescription Name="Triple Room">Double bed and single bed.</RoomDescription>
								</RoomType>
							</RoomTypes>
							<RatePlans>
								<RatePlan RatePlanCode="BAR">
									<RatePlanDescription>Best Available Rate.</RatePlanDescription>
									<Commission>
										<CommissionPayableAmount Amount="60.00" CurrencyCode="EUR"/>
									</Commission>
									<MealsIncluded MealPlanCode="14"/>
									<!-- Additional MealsIncluded elements -->
								</RatePlan>
							</RatePlans>
							<RoomRates>
								<RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
									<Rates>
										<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2026-10-05" ExpireDate="2026-10-08">
											<Base AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
												<Taxes>
													<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
													<!-- Additional Tax elements -->
												</Taxes>
											</Base>
											<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
												<Taxes>
													<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
													<!-- Additional Tax elements -->
												</Taxes>
											</Total>
										</Rate>
									</Rates>
									<!-- Additional Rates elements -->
								</RoomRate>
							</RoomRates>
							<GuestCounts>
								<GuestCount AgeQualifyingCode="10" Count="2"/>
								<GuestCount AgeQualifyingCode="8" Age="7" Count="1"/>
								<GuestCount AgeQualifyingCode="8" Age="10" Count="1"/>
								<GuestCount AgeQualifyingCode="7" Count="1"/>
								<!-- Additional GuestCount elements -->
							</GuestCounts>
							<TimeSpan Start="2026-10-05" End="2026-10-08"/>
							<Total AmountBeforeTax="565.50" AmountAfterTax="628.25" CurrencyCode="EUR">
								<Taxes>
									<Tax Type="inclusive" Code="35" Amount="62.75" CurrencyCode="EUR"/>
									<!-- Additional Tax elements -->
								</Taxes>
							</Total>
							<BasicPropertyInfo HotelCode="HOTELCODE" HotelName="The Hotel Name"/>
							<ResGuestRPHs>
								<ResGuestRPH RPH="1"/>
								<!-- Additional ResGuestRPH elements -->
							</ResGuestRPHs>
							<ServiceRPHs>
								<ServiceRPH RPH="1"/>
								<!-- Additional ServiceRPH elements -->
							</ServiceRPHs>
							<Comments>
								<Comment>
									<Text>Please, add some extra towels</Text>
								</Comment>
							</Comments>
							<SpecialRequests>
								<SpecialRequest Name="Extra Bed">
									<Text>Yes</Text>
								</SpecialRequest>
							</SpecialRequests>
						</RoomStay>
						<!-- Additional RoomStay elements -->
					</RoomStays>
					<Services>
						<Service ServiceInventoryCode="EXTRA_BED" Inclusive="true" ServiceRPH="1" Quantity="1" ID="12346">
							<Price>
								<Base AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="EUR">
									<Taxes Amount="0.25">
										<Tax Code="19" Percent="10" Amount="0.25">
											<TaxDescription>
												<Text>GST 10 percent</Text>
											</TaxDescription>
										</Tax>
									</Taxes>
								</Base>
								<Total AmountBeforeTax="2.50" AmountAfterTax="2.75" CurrencyCode="EUR">
									<Taxes Amount="0.25">
										<Tax Code="19" Percent="10" Amount="0.25">
											<TaxDescription>
												<Text>GST 10 percent</Text>
											</TaxDescription>
										</Tax>
									</Taxes>
								</Total>
								<RateDescription>
									<Text>Extra person charge EUR 2.50 per day for cot</Text>
								</RateDescription>
							</Price>
							<ServiceDetails>
								<TimeSpan Start="2026-10-05" End="2026-10-08"/>
							</ServiceDetails>
						</Service>
						<!-- Additional Service elements -->
					</Services>
					<ResGuests>
						<ResGuest ResGuestRPH="1" ArrivalTime="14:00:00" PrimaryIndicator="1">
							<Profiles>
								<ProfileInfo>
									<Profile ProfileType="1">
										<Customer>
											<PersonName>
												<NamePrefix>Mr</NamePrefix>
												<GivenName>John</GivenName>
												<Surname>Smith</Surname>
											</PersonName>
											<Telephone PhoneNumber="+61123456789"/>
											<Email>test@siteminder.com</Email>
											<Address>
												<AddressLine>200 George St</AddressLine>
												<AddressLine>Level 3</AddressLine>
												<CityName>Sydney</CityName>
												<PostalCode>2000</PostalCode>
												<StateProv>NSW</StateProv>
												<CountryName>Australia</CountryName>
											</Address>
											<CustLoyalty ProgramID="LoyaltyProgramName" MembershipID="123456789" ExpireDate="2026-12-31"/>
											<Document DocID="987654321P" DocType="5" DocHolderNationality="AU" BirthDate="1996-10-05" Gender="Male" BirthCountry="AU" BirthPlace="AU" EffectiveDate="2026-10-05" ExpireDate="2027-10-05" DocIssueAuthority="DAFT" DocIssueLocation="AU" DocIssueStateProv="AU" DocIssueCountry="AU">
												<DocHolderName>John Smith</DocHolderName>
											</Document>
										</Customer>
									</Profile>
								</ProfileInfo>
							</Profiles>
						</ResGuest>
						<!-- Additional ResGuest elements -->
					</ResGuests>
					<ArrivalTransport>
						<TransportInfo Type="Air" ID="QF123" Time="2025-10-05T13:00:00"/>
					</ArrivalTransport>
					<DepartureTransport>
						<TransportInfo Type="Air" ID="QF321" Time="2025-10-08T17:00:00"/>
					</DepartureTransport>
					<ResGlobalInfo>
						<HotelReservationIDs>
							<HotelReservationID ResID_Type="14" ResID_Value="123456789"/>
						</HotelReservationIDs>
						<Comments>
							<Comment>
								<Text>High floor if possible</Text>
							</Comment>
							<!-- Additional Comment elements -->
						</Comments>
						<Total CurrencyCode="EUR" AmountBeforeTax="565.50" AmountAfterTax="628.25">
							<Taxes>
								<Tax Type="inclusive" Code="35" Amount="62.75" CurrencyCode="EUR"/>
							</Taxes>
							<TPA_Extensions>
								<Total includesCommission="true"/>
							</TPA_Extensions>
						</Total>
						<Guarantee>
							<GuaranteesAccepted>
								<GuaranteeAccepted>
									<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
										<CardHolderName>John Smith</CardHolderName>
										<TPA_Extensions>
											<VirtualCreditCard isVCC="true" VCCActivationDate="2025-09-05" VCCCurrencyCode="EUR" VCCCurrentBalance="628.25" VCCDeactivationDate="2025-10-08"/>
										</TPA_Extensions>
									</PaymentCard>
								</GuaranteeAccepted>
							</GuaranteesAccepted>
						</Guarantee>
						<Profiles>
							<ProfileInfo>
								<Profile ProfileType="1">
									<Customer>
										<PersonName>
											<NamePrefix>Mr</NamePrefix>
											<GivenName>John</GivenName>
											<Surname>Smith</Surname>
										</PersonName>
										<Telephone PhoneNumber="0266564100"/>
										<Email>johnsmith@mail.com</Email>
										<Address>
											<AddressLine>1 George St</AddressLine>
											<AddressLine>CBD</AddressLine>
											<CityName>Sydney</CityName>
											<PostalCode>2000</PostalCode>
											<StateProv>NSW</StateProv>
											<CountryName>Australia</CountryName>
										</Address>
									</Customer>
								</Profile>
							</ProfileInfo>
							<ProfileInfo>
								<Profile ProfileType="3">
									<CompanyInfo ID="CORP">
										<CompanyName>COMPANY</CompanyName>
										<TelephoneInfo PhoneNumber="0266564101"/>
										<Email>contact@company.com</Email>
										<AddressInfo>
											<AddressLine>3 George St</AddressLine>
											<AddressLine>CBD</AddressLine>
											<CityName>Sydney</CityName>
											<PostalCode>2000</PostalCode>
											<StateProv>NSW</StateProv>
											<CountryName>Australia</CountryName>
										</AddressInfo>
									</CompanyInfo>
								</Profile>
							</ProfileInfo>
							<ProfileInfo>
								<Profile ProfileType="4">
									<UniqueID ID="56789"/>
									<CompanyInfo>
										<CompanyName>TRAVEL AGENT LTD</CompanyName>
										<TelephoneInfo PhoneNumber="0266564100"/>
										<Email>contact@travelagent.com</Email>
										<AddressInfo>
											<AddressLine>4 George St</AddressLine>
											<AddressLine>CBD</AddressLine>
											<CityName>Sydney</CityName>
											<PostalCode>2000</PostalCode>
											<StateProv>NSW</StateProv>
											<CountryName>Australia</CountryName>
										</AddressInfo>
									</CompanyInfo>
								</Profile>
							</ProfileInfo>
						</Profiles>
					</ResGlobalInfo>
				</HotelReservation>
			</HotelReservations>
		</OTA_HotelResNotifRQ>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
```

</details>

## Common Questions

<details>

<summary>How can we avoid overbooking?</summary>

While overbooking is rare, it can occur when the last available room is booked simultaneously across multiple channels.

**SiteConnect Behaviour:**

* Accepts all valid reservations received
* Sends all bookings to the property
* Does not reject reservations based on availability

**Resolution:**

* The property typically works directly with booking channels to resolve overbookings
* Hotels may honor all reservations and arrange alternative accommodation if needed
* Your channel's policy determines how overbookings are handled with guests

**Prevention:**

* Ensure fast response times to availability updates
* Process availability changes immediately upon receiving them
* Implement real-time inventory management in your system

</details>

<details>

<summary>After sending a cancelled reservation, why didn't availability increase?</summary>

This is **standard SiteMinder functionality**. Cancelled reservations (or modifications that reduce room bookings) do not automatically increase availability.

**Standard Behavior:**

* Availability is **hotel-controlled** or **PMS-controlled**
* Hotels must manually update availability after cancellations
* SiteMinder processes the cancellation but doesn't adjust inventory automatically

**Auto-Replenishment Option:** If the hotel has enabled Auto-Replenishment in SiteMinder settings:

* System automatically increases availability for cancelled rooms
* You will receive updated availability via `OTA_HotelAvailNotifRQ`
* This setting is property-specific and not enabled by default

</details>

<details>

<summary>What happens if a hotel unmaps a room rate or disables the channel, and a reservation is received?</summary>

SiteConnect will **still accept the reservation**, but availability handling differs:

**Unmapped Room Rate:**

* Reservation is accepted and stored
* **Availability is NOT adjusted** (booking can't be assigned to a room type)
* Hotel sees the reservation but must manually manage it

**Disabled Channel:**

* Reservation is accepted and stored
* **Availability is adjusted** in SiteMinder
* Updated availability is **NOT sent back** to your channel (channel is disabled)

**Best Practice:**

* Validate room rate mappings exist before sending reservations
* Monitor for unmapped room rate errors in your integration logs

</details>

<details>

<summary>Is it possible to get the status or confirmation of a reservation after sending it?</summary>

No, SiteConnect does not provide reservation status queries or confirmations.

**Reservation Flow:**

1. Booking channel sends `OTA_HotelResNotifRQ`
2. SiteMinder responds with `OTA_HotelResNotifRS` (Success or Error)
3. **Success means:** Reservation received and accepted
4. **After acceptance:** Reservation is confirmed and delivered to PMS. Also, availability is updated and distributed to all channels

**No Status Changes:**

* Once accepted, reservations are considered confirmed and valid
* No "pending" or "processing" status exists
* No query endpoint to check reservation status

**Error Handling:** If you receive an Error response, the reservation was **not** accepted. Fix the issue and resend the complete reservation.

</details>

<details>

<summary>In what instances can a reservation fail to be received by SiteConnect?</summary>

Reservations can fail for the following reasons:

**XML/Format Issues:**

* Incorrect XML structure (invalid elements or attributes)
* Missing mandatory fields
* Invalid data types or formats

**Authentication Issues:**

* Invalid username or password
* Missing or malformed Security Header

**Hotel Configuration:**

* `HotelCode` not found in SiteMinder database
* Hotel not configured for your channel

**Important:** SiteConnect **will still accept** reservations even if:

* Hotel lacks availability (no availability validation)
* Room rates are not mapped in SiteMinder Platform
* Rate plans don't match

**Error Response:** Failed reservations return `OTA_HotelResNotifRS` with `<Errors>` element containing error type and description.

</details>

<details>

<summary>What data should I include in modified or cancelled reservation messages?</summary>

Include **all data from the original reservation** plus the modification/cancellation details.

**Required for Modifications (`ResStatus="Modify"`):**

* Complete original reservation data
* Updated values (dates, rates, guests, etc.)
* `CreateDateTime` (original booking time)
* `LastModifyDateTime` (when modification occurred)

**Required for Cancellations (`ResStatus="Cancel"`):**

* Complete original reservation data
* `CreateDateTime` (original booking time)
* `LastModifyDateTime` (when cancellation occurred)
* Updated VCC balance (set to 0.00 or cancellation policy amount)

**Why Complete Data Required:**

* SiteMinder **rewrites the entire reservation** on modifications/cancellations
* Missing data causes hotels to lose important information
* Data flows to connected PMS/CRS systems
* Incomplete data may cause PMS integration failures

</details>

<details>

<summary>Are credit card details visible to the hotel?</summary>

Yes, hotels can view credit card details in SiteMinder Platform, **except CVV/CVC**.

**Visible to Hotel:**

* Card number
* Cardholder name
* Expiry date
* Card type/code
* VCC details (if applicable)

**Not Visible in Platform:**

* CVV/CVC (Card Security Code)

**CVV/CVC Delivery:**

* Only available in **Reservation Notification Email** (if enabled for your channel)
* Never stored in SiteMinder database (PCI compliance)
* Never passed to PMS systems

**PMS Integration:** If the property has a PMS connected to SiteMinder that supports credit card details, the same information (excluding CVV/CVC) is forwarded to the PMS.

</details>

<details>

<summary>Is it okay to make a booking without payment details?</summary>

Yes, payment details are **optional**. Both `Guarantee` and `DepositPayments` sections can be omitted.

**Use Cases for No Payment Details:**

* Pay-at-property bookings
* Invoiced reservations
* Alternative payment methods not supported in API
* Free stays or complimentary bookings

**When to Include Payment Details:**

* Credit card guarantee provided
* Deposit collected
* Virtual Credit Card (VCC) issued
* Payment already processed

SiteMinder accepts reservations regardless of payment information presence.

</details>

<details>

<summary>What is the advantage of sending VCC instead of standard credit cards?</summary>

Virtual Credit Cards (VCC) provide significant advantages for reservation processing:

**Security and Accuracy:**

* **Reduced errors:** VCC details clearly displayed in SiteMinder Platform
* **Direct PMS reading:** PMS systems can read VCC information automatically
* **Minimized human error:** Less manual card entry required
* **Controlled usage:** VCC limits and activation/deactivation dates prevent misuse

**Payment Processing:**

* **SiteMinder Pay integration:** Simplifies transactions for hotels using SiteMinder Pay
* **Clear balance tracking:** `VCCCurrentBalance` shows exact chargeable amount
* **Modification handling:** Easy to update balance for changes/cancellations

**Compliance:**

* **PSD2 exemption:** VCCs excluded from Strong Customer Authentication requirements
* **Faster processing:** No additional authentication steps needed

**Recommendation:** VCC is optional but highly recommended when available.

</details>

<details>

<summary>Can the VCC CurrencyCode differ from the Reservation Total CurrencyCode?</summary>

Yes, the `VCCCurrencyCode` can differ from the reservation's `CurrencyCode`.

**Common Scenario:**

* Reservation made in one currency (e.g., USD)
* Hotel collects in different currency (e.g., NZD) via VCC
* Both currencies clearly specified in respective sections

**Example:**

```xml
<Total CurrencyCode="USD" AmountAfterTax="500.00"/>
<!-- ... -->
<VirtualCreditCard VCCCurrencyCode="NZD" VCCCurrentBalance="750.00"/>
```

**Handling:**

* Each currency is valid in its context
* Currency conversion handled outside API
* Hotels see both currencies in their platform

</details>

<details>

<summary>What's the difference between Guests and Customers in reservations?</summary>

**Guests (`ResGuest`):**

* People **staying in the rooms**
* Linked to specific RoomStays via `ResGuestRPH`
* Can have multiple guests per reservation
* Contains: Name, contact details, arrival time, loyalty info, ID documents

**Customer (`Profile ProfileType="1"` in `ResGlobalInfo/Profiles`):**

* Person who **made the booking** or is the primary contact
* Only one customer per reservation
* May or may not be staying at the property
* Contains: Name, contact details, address

**Relationship:**

* Guest and Customer can be the same person
* Guest and Customer can be different people (e.g., assistant booking for executive)
* Customer profile is mandatory, Guest profiles are recommended

**Best Practice:** Provide both complete Customer information and individual Guest details when available for better hotel service and PMS integration.

</details>

<details>

<summary>The hotel received a booking after the check-in date. Why did this happen?</summary>

This can occur when the `CreateDateTime` value sent in the `OTA_HotelResNotifRQ` uses an incorrect time zone offset. SiteConnect transmits the `CreateDateTime` as provided by the channel — if the timestamp is sent as UTC (suffix `Z`) but the actual booking time was in the property's local time zone, the value will be misinterpreted.

For example, if a booking was created at 20:57:41 in Jakarta (UTC+7), the correct value should be either:

* `2026-04-18T20:57:41+07:00` (local time with offset), or
* `2026-04-18T13:57:41Z` (converted to true UTC)

Sending `2026-04-18T20:57:41Z` instead tells SiteConnect the booking was made at 20:57 UTC — which converts to 03:57 local time the following day, placing it after the check-in date.

SiteConnect converts the received `CreateDateTime` to the property's local time zone without modifying the original value. Ensure your system sends the timestamp in one of the two valid formats above to avoid bookings appearing after the check-in date.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# FAQ

Get answers to frequently asked questions about the SiteConnect API, including features, technical behaviour, and integration details.

### Getting Started

<details>

<summary>How long does SiteConnect integration take?</summary>

Approximately **60 days from initiation to production**, including development, testing, certification and pilot phases.

For more details, review our [Integration Process](https://developer.siteminder.com/siteminder-apis/integration-process) guide.

</details>

<details>

<summary>What are the mandatory components to certify in SiteConnect?</summary>

**Mandatory:**

* Rooms and Rates
* Availability
* Stop Sell
* Rates (PDP or OBP)
* Reservations (Initial Delivery)

**Strongly Recommended:**

* Minimum Stay on Arrival
* Maximum Stay on Arrival
* Minimum Stay Through
* Maximum Stay Through
* Close to Arrival (CTA)
* Close to Departure (CTD)
* Reservation Modifications and Cancellations

</details>

<details>

<summary>What test credentials and resources will SiteMinder provide?</summary>

**SiteMinder will provide:**

* Test endpoints for reservations
* Username and Password for authentication
* RequestorID (channel code)
* Access to test Platform with pre-configured room types and rate plans
* WSDL files (Standard and Inlined versions)

**Booking Channel must provide:**

* Endpoint URL for Rooms and Rates retrieval
* Endpoint URL for receiving ARI updates (or single endpoint for both)
* Username and Password for SiteMinder to authenticate
* HotelCode for test property

</details>

### Authentication

<details>

<summary>What authentication method does SiteConnect use?</summary>

SiteConnect uses **WS-Security (WSSE) UsernameToken** authentication in the SOAP Security Header.

**Key Requirements:**

* Partners provide a single username and password that is global for all hotels
* All communication occurs over HTTPS for encryption
* Plain text passwords are acceptable within the encrypted HTTPS channel
* The `Password @Type` attribute must be: `http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText`

</details>

<details>

<summary>Does SiteConnect require separate credentials for each hotel?</summary>

No, SiteConnect uses **global authentication** where partners provide a single username and password that applies to all hotels.

**How it works:**

* The same authentication credentials are used across all properties
* The `HotelCode` attribute in each message identifies the specific property
* This simplifies credential management while maintaining clear property identification

**Example:** If you connect 100 hotels through SiteConnect, you use the same username and password for all messages, with each hotel distinguished by its unique HotelCode.

</details>

<details>

<summary>We're experiencing WS-Security compatibility issues between .NET and Java. How can we resolve this?</summary>

Compatibility issues can occur with WS-Security between .NET and Java frameworks.

**Solution:** Adjust .NET to accept WebRequests from Java. Refer to [WSSE Authentication for WebRequest/Response](https://www.codeproject.com/Articles/19339/WSSE-Authentication-for-WebRequest-Response) for detailed implementation guidance, including custom authentication modules.

</details>

<details>

<summary>Which Java libraries and versions are recommended for SiteConnect?</summary>

SiteMinder's SiteConnect test environment uses:

**Java Version:**

* Java(TM) SE Runtime Environment (build 1.6.0\_21-b06)
* Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)

**Framework:**

* Spring Web Services

**Required Libraries:**

* `spring-ws-core-1.5.9.jar`
* `spring-ws-security-1.5.9.jar`

**Note**: These are reference versions used in SiteMinder's environment. Newer compatible versions may also work.

</details>

### Core Concepts <a href="#core-concepts" id="core-concepts"></a>

<details>

<summary>What is the message exchange model for SiteConnect?</summary>

SiteConnect uses a **hybrid PUSH/PULL model**:

**PUSH (SiteMinder → Booking Channel):**

* Availability updates
* Restriction updates
* Rate updates

**PULL (Booking Channel → SiteMinder):**

* Rooms and Rates retrieval (on-demand when mapping is accessed)

**PUSH (Booking Channel → SiteMinder):**

* Reservations (new bookings, modifications, cancellations)

</details>

<details>

<summary>What data will be pushed during first-time connection?</summary>

When connecting to SiteConnect for the first time, the system will push **all Availability, Restrictions, and Rates data** to the booking channel. The requests will be sent back-to-back to ensure the booking channel receives all necessary data to synchronize inventory.

</details>

<details>

<summary>How many days in advance can SiteConnect send updates?</summary>

SiteConnect can send updates for availability, restrictions, and rates up to **750 days in advance**.

**Key Points:**

* The specific update period is configured by SiteMinder during channel setup
* Typical configurations range 365 to 750 days
* Each morning, the system automatically adds one new date at the end of the update period to maintain a rolling window

</details>

<details>

<summary>How does SiteConnect batch and send ARI updates?</summary>

**Update Frequency:**

* New update rounds are sent every **2 minutes**
* Only the most recent version of each room/rate/date combination is sent
* Updates per hotel are single-threaded, but multiple hotels update concurrently

**Message Structure:**

* Each message contains updates for **one room/rate pair only**
* Maximum payload: **210 days** (30 date elements × 7-day spans)
* Date ranges are bundled based on data consistency
* Only changed room/rate/date combinations are sent (delta updates)
* When triggered, ALL availability, rate, and restriction values for that combination are included

**Response Impact:**

* Update frequency depends on how quickly the booking channel responds
* Faster responses enable more frequent updates

</details>

<details>

<summary>Why do we see spikes in ARI updates at certain times?</summary>

ARI update patterns are **customer-driven**, not controlled by SiteMinder:

**Common Causes:**

* Revenue Management Systems (RMS) running scheduled calculations
* Hotels manually updating inventory during business hours
* Bulk updates across the update period
* Time zone differences creating regional activity peaks

**Important:** SiteMinder only passes through actual data changes. Non-delta changes are not forwarded to connectivity partners. Updates arrive as changes are made and as quickly as your system accepts them.

</details>

<details>

<summary>Does SiteConnect support release period?</summary>

No. When a property configures a release period in SiteMinder Platform, the system translates that internally into Stop Sell behaviour for the affected room rates and dates when sending to booking channels.

</details>

### Technical Requirements

<details>

<summary>Can we connect using SOAP 1.2?</summary>

No, SiteConnect **only supports SOAP 1.1**. If your system uses SOAP 1.2, you must adjust it to use SOAP 1.1 for SiteConnect integration. This is a mandatory requirement.

</details>

<details>

<summary>What are the Content-Type requirements?</summary>

All SOAP XML requests to SiteMinder must have a Content-Type of **`text/xml; charset=utf-8`**. Other Content-Types will not be accepted.

</details>

<details>

<summary>What SSL/TLS versions are supported?</summary>

SiteConnect supports **TLS 1.1 and above** (TLS 1.1, TLS 1.2, TLS 1.3).

**Requirements:**

* Production URI must use HTTPS
* SiteMinder does not support self-signed SSL certificates

</details>

<details>

<summary>What are the response time expectations?</summary>

**Optimal Performance:**

* Aim for **1-2 second average** response times
* Sub-1-second responses are ideal

**Timeout Limits:**

* SiteMinder enforces a **20-second timeout** for ARI update requests
* This is a failsafe - consistent timeouts or prolonged response times should not occur frequently

**Scalability Requirements:**

* Conduct thorough performance testing on production servers
* Ensure systems can scale with the number of connected hotels
* Must handle large data loads (up to 750 days) in short periods
* Must accommodate multiple properties going live simultaneousl

</details>

### Error Handling

<details>

<summary>Will SiteConnect retry failed ARI update requests?</summary>

Yes, SiteConnect has an automatic retry system for availability, restrictions, and rate messages:

**Retry Behavior:**

* Initial timeout: **15 seconds**
* Retry interval: Every **2 minutes**
* New requests queue until a successful response is received
* Connection may be disabled after extended outages

</details>

<details>

<summary>How should errors be returned in SiteConnect?</summary>

Errors must be:

* Returned within a **SOAP Envelope**
* Use the appropriate response message container:
  * `OTA_HotelAvailRS` for Rooms and Rates errors
  * `OTA_HotelAvailNotifRS` for Availability/Restrictions errors
  * `OTA_HotelRateAmountNotifRS` for Rate errors
  * `OTA_HotelResNotifRS` for Reservation errors
* Include appropriate error codes and descriptive error messages

**Important:** For application-level errors, respond with SOAP error messages. Only use HTTP standard error codes (503, 504, etc.) for server-level issues.

</details>

### Architecture

<details>

<summary>Are reservation messages processed atomically?</summary>

Yes. All messages in SiteConnect are **atomic** - either the entire message succeeds or the entire message fails.

If you receive an Error response while pushing reservation messages, **none** of the data in that message was processed. You must fix the error and resend the complete message.

</details>

<details>

<summary>What is the HotelCode and why is it important?</summary>

The **HotelCode** is a unique identifier for each property within your booking channel system.

**Requirements:**

* Must be unique for each property per booking channel
* Used in every message to identify which property the message relates to
* Provided by the booking channel and configured in SiteMinder during setup

**Function:** While authentication credentials are global across all hotels, the HotelCode ensures each message is routed to the correct property.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Reference Tables

Find reference tables that support your integration with SiteMinder APIs, including technical values, configuration options, and predefined data.


# Document Type Code (DOC)

Lists codes identifying document types used in transactions.

<table><thead><tr><th width="112">Code</th><th width="656">Type</th></tr></thead><tbody><tr><td>1</td><td>Visa</td></tr><tr><td>2</td><td>Passport</td></tr><tr><td>3</td><td>Military identification</td></tr><tr><td>4</td><td>Drivers license</td></tr><tr><td>5</td><td>National identity document</td></tr><tr><td>6</td><td>Vaccination certificate</td></tr><tr><td>7</td><td>Alien registration number</td></tr><tr><td>8</td><td>Insurance policy number</td></tr><tr><td>9</td><td>Tax exemption number</td></tr><tr><td>10</td><td>Vehicle registration/license number</td></tr><tr><td>11</td><td>Border crossing card</td></tr><tr><td>12</td><td>Refugee travel document</td></tr><tr><td>13</td><td>Pilot's license</td></tr><tr><td>14</td><td>Permanent resident card</td></tr><tr><td>15</td><td>Redress number</td></tr><tr><td>16</td><td>Known traveler number</td></tr><tr><td>17</td><td>Non-standard</td></tr><tr><td>18</td><td>Merchant mariner</td></tr><tr><td>19</td><td>Air Nexus card</td></tr><tr><td>20</td><td>Crew member certificate</td></tr><tr><td>21</td><td>Passport card</td></tr><tr><td>22</td><td>Naturalization certificate</td></tr></tbody></table>


# Error Codes (ERR)

Contains codes for specific errors encountered within the API.

### General Errors

<table><thead><tr><th width="119">Code</th><th width="247">Name</th><th>Description</th></tr></thead><tbody><tr><td>187</td><td>System currently unavailable</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>448</td><td>System error</td><td><code>Invalid Username and/or Password</code></td></tr><tr><td>450</td><td>Unable to process</td><td>EXPLAIN REASON FOR FAILURE</td></tr></tbody></table>

### Update Errors

<table><thead><tr><th width="120">Code</th><th width="246">Name</th><th>Description</th></tr></thead><tbody><tr><td>137</td><td>Adult occupancy mismatch</td><td><code>Invalid included occupancy</code></td></tr><tr><td>249</td><td>Invalid rate code</td><td><code>Rate code not found for this hotel</code></td></tr><tr><td>321</td><td>Required field missing</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>375</td><td>Hotel not active</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>392</td><td>Invalid hotel code</td><td><code>Hotel not found for HotelCode=XXXXXX</code></td></tr><tr><td>397</td><td>Invalid number of adults</td><td><code>Invalid number of adults</code></td></tr><tr><td>402</td><td>Invalid room type</td><td><code>Room type code not found for this hotel</code></td></tr><tr><td>436</td><td>Rate does not exist</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>783</td><td>Room or rate not found</td><td><code>Combination of room code and rate code not found for this hotel</code></td></tr><tr><td>842</td><td>Rate not loaded</td><td>EXPLAIN REASON FOR FAILURE</td></tr></tbody></table>


# Error Warning Types (EWT)

Defines types of warnings that accompany specific errors.

<table><thead><tr><th width="101">Code</th><th width="238">Name</th><th>Reason</th></tr></thead><tbody><tr><td>1</td><td>Unknown</td><td>Indicates an unknown error.</td></tr><tr><td>2</td><td>No implementation</td><td>Indicates that the target business system has no implementation for the intended request.</td></tr><tr><td>3</td><td>Biz rule</td><td>Indicates that the XML message has passed a low-level validation check, but that the business rules for the request message were not met.</td></tr><tr><td>4</td><td>Authentication</td><td>Indicates the message lacks adequate security credentials.</td></tr><tr><td>5</td><td>Authentication timeout</td><td>Indicates that the security credentials in the message have expired.</td></tr><tr><td>6</td><td>Authorization</td><td>Indicates the message lacks adequate security credentials.</td></tr><tr><td>7</td><td>Protocol violation</td><td>Indicates that a request was sent within a message exchange that does not align to the message.</td></tr><tr><td>8</td><td>Transaction model</td><td>Indicates that the target business system does not support the intended transaction-oriented operation.</td></tr><tr><td>9</td><td>Authentical model</td><td>Indicates the type of authentication requested is not recognized.</td></tr><tr><td>10</td><td>Required field missing</td><td>Indicates that an element or attribute that is required in by the schema (or required by agreement between trading partners) is missing from the message.</td></tr><tr><td>11</td><td>Advisory</td><td></td></tr><tr><td>12</td><td>Processing exception</td><td>Indicates that during processing of the request that a not further defined exception occurred.</td></tr><tr><td>13</td><td>Application error</td><td>Indicates that an involved backend application returned an error or warning, which is passed back in the response message.</td></tr></tbody></table>


# Fee Tax Type (FTT)

Includes codes for tax and fee types applied to charges.

<table><thead><tr><th width="113">Code</th><th>Name</th></tr></thead><tbody><tr><td>1</td><td>Bed tax</td></tr><tr><td>2</td><td>City hotel fee</td></tr><tr><td>3</td><td>City tax</td></tr><tr><td>4</td><td>County tax</td></tr><tr><td>5</td><td>Energy tax</td></tr><tr><td>6</td><td>Federal tax</td></tr><tr><td>7</td><td>Food &#x26; beverage tax</td></tr><tr><td>8</td><td>Lodging tax</td></tr><tr><td>9</td><td>Maintenance fee</td></tr><tr><td>10</td><td>Occupancy tax</td></tr><tr><td>11</td><td>Package fee</td></tr><tr><td>12</td><td>Resort fee</td></tr><tr><td>13</td><td>Sales tax</td></tr><tr><td>14</td><td>Service charge</td></tr><tr><td>15</td><td>State tax</td></tr><tr><td>16</td><td>Surcharge</td></tr><tr><td>17</td><td>Total tax</td></tr><tr><td>18</td><td>Tourism tax</td></tr><tr><td>19</td><td>VAT/GST tax</td></tr><tr><td>20</td><td>Surplus Lines Tax</td></tr><tr><td>21</td><td>Insurance Premium Tax</td></tr><tr><td>22</td><td>Application Fee</td></tr><tr><td>23</td><td>Express Handling Fee</td></tr><tr><td>24</td><td>Exempt</td></tr><tr><td>25</td><td>Standard</td></tr><tr><td>26</td><td>Zero-rated</td></tr><tr><td>27</td><td>Miscellaneous</td></tr><tr><td>28</td><td>Room Tax</td></tr><tr><td>29</td><td>Early checkout fee</td></tr><tr><td>30</td><td>Country tax</td></tr><tr><td>31</td><td>Extra person charge</td></tr><tr><td>32</td><td>Banquet service fee</td></tr><tr><td>33</td><td>Room service fee</td></tr><tr><td>34</td><td>Local fee</td></tr><tr><td>35</td><td>Goods and services tax (GST)</td></tr><tr><td>36</td><td>Value Added Tax (VAT)</td></tr><tr><td>37</td><td>Crib fee</td></tr><tr><td>38</td><td>Rollaway fee</td></tr><tr><td>39</td><td>Assessment/license tax</td></tr><tr><td>40</td><td>Pet sanitation fee</td></tr><tr><td>41</td><td>Not known</td></tr><tr><td>42</td><td>Child rollaway charge</td></tr><tr><td>43</td><td>Convention tax</td></tr><tr><td>44</td><td>Extra child charge</td></tr><tr><td>45</td><td>Standard food and beverage gratuity</td></tr><tr><td>46</td><td>National government tax</td></tr><tr><td>47</td><td>Adult rollaway fee</td></tr><tr><td>48</td><td>Beverage with alcohol</td></tr><tr><td>49</td><td>Beverage without alcohol</td></tr><tr><td>50</td><td>Tobacco</td></tr><tr><td>51</td><td>Food</td></tr><tr><td>52</td><td>Total surcharges</td></tr><tr><td>53</td><td>State cost recovery fee</td></tr><tr><td>54</td><td>Miscellaneous fee</td></tr><tr><td>55</td><td>Destination amenity fee</td></tr></tbody></table>


# HTTP Error Handling

Guidelines for interpreting and handling HTTP 4xx and 5xx responses.

HTTP errors provide important information about how a request was processed and whether any action is needed from your system. This page outlines how to interpret the most common 4xx and 5xx responses returned by SiteMinder APIs, along with recommended handling strategies. Understanding these status codes will help you troubleshoot issues efficiently, ensure smoother message flows, and maintain a reliable integration.

### Handling 400 Errors

4xx errors indicate that the request sent by your system cannot be processed due to an issue with the message itself—for example, missing fields, incorrect formatting, invalid credentials, or using an unsupported method. These errors require corrections on the client side before the request can be retried.

| Error Code                   | Error Reason                                                                                                                                                 | Suggested Handling Method                                                                                                                                                        |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 400 – Bad Request            | The request is malformed or does not meet the API specification (e.g., missing required fields, incorrect formatting, invalid characters, invalid XML/JSON). | Validate the structure and content of the request. Ensure that all required fields are present and formatted according to our API specifications. Correct the request and retry. |
| 401 – Unauthorized           | Authentication failed or required credentials are missing (e.g., incorrect username/password, missing or invalid token).                                     | Confirm that the correct credentials and required authentication headers are being used. Update or refresh credentials if necessary.                                             |
| 403 – Forbidden              | The request was understood, but the client is not authorised to access this resource.                                                                        | Confirm that the credentials used have the required permissions. If access should be granted, contact the Partner Integrations team for assistance.                              |
| 404 – Not Found              | The requested endpoint does not exist, is misspelled, or is not enabled for the partner.                                                                     | Verify the endpoint URL, including path and case sensitivity. Check the integration documentation to confirm that the endpoint is supported.                                     |
| 405 – Method Not Allowed     | The HTTP method used is not supported for this endpoint.                                                                                                     | Update the request to use the correct HTTP method as defined in the API specification.                                                                                           |
| 406 – Not Acceptable         | The server cannot return a response in the format specified by the request headers.                                                                          | Confirm that the request’s Accept header matches the expected response type. Adjust the header or format before retrying.                                                        |
| 409 – Conflict               | The request conflicts with the current state of the resource (e.g., duplicate reservation, conflicting operation).                                           | Review the logic triggering the request. Ensure that identifiers are unique and that duplicate messages are not being sent.                                                      |
| 415 – Unsupported Media Type | The Content-Type header or payload format is not supported.                                                                                                  | Update the Content-Type header and ensure the payload format matches the requirements for this endpoint.                                                                         |

### Handling 500 Errors

5xx errors occur when the request is valid, but the server is unable to process it due to an internal problem or an issue with an upstream system. These errors are usually temporary, and in most cases, a retry strategy is recommended. If the error persists after retries, contact our [Application Operations](https://www.siteminder.com/partners-contact/) team for support.

| Error Code                       | Error Reason                                                                                                  | Suggested Handling Method                                                                                                                                                                                                                                                                                                           |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 500 – Internal Server Error      | The server encountered an unexpected condition and could not complete the request.                            | Implement a retry strategy to determine if the issue is temporary. If the error persists, validate the request. If the request appears correct, contact our Application Operations team.                                                                                                                                            |
| 501 – Not Implemented            | The server recognises the request but does not support the functionality required to process it.              | Do not retry. Confirm whether the requested operation is supported by the web service for this endpoint. Adjust the integration to use supported features only.                                                                                                                                                                     |
| 502 – Bad Gateway                | The server, acting as a gateway or proxy, received an invalid or unexpected response from an upstream system. | <p>Implement an <a href="https://en.wikipedia.org/wiki/Exponential_backoff">Exponential Backoff</a> strategy:</p><p><br>5 seconds → 10 seconds → 20 seconds → 40 seconds → then every 1 minute until a minimum timeout of 30 minutes.<br><br>If the issue persists beyond the timeout, contact our Application Operations team.</p> |
| 503 – Service Unavailable        | The server is temporarily unable to process the request due to high load or maintenance.                      | Use the same [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff) strategy recommended for HTTP 502 (minimum 30-minute timeout). If the service does not recover, contact our Application Operations team.                                                                                                      |
| 504 – Gateway Timeout            | The server did not receive a timely response from an upstream system.                                         | Apply the [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff) strategy (minimum 30-minute timeout). If the timeout continues beyond this window, contact our Application Operations team.                                                                                                                      |
| 505 – HTTP Version Not Supported | The server does not support the HTTP protocol version used in the request.                                    | Do not retry. Verify that the client implementation is using the correct HTTP version and configuration.                                                                                                                                                                                                                            |


# Meal Plan Type (MPT)

Lists codes for different meal plans available for bookings.

<table><thead><tr><th width="113">Code</th><th width="649">Type</th></tr></thead><tbody><tr><td>1</td><td>All inclusive</td></tr><tr><td>2</td><td>American</td></tr><tr><td>3</td><td>Bed &#x26; breakfast</td></tr><tr><td>4</td><td>Buffet breakfast</td></tr><tr><td>5</td><td>Caribbean breakfast</td></tr><tr><td>6</td><td>Continental breakfast</td></tr><tr><td>7</td><td>English breakfast</td></tr><tr><td>8</td><td>European plan</td></tr><tr><td>9</td><td>Family plan</td></tr><tr><td>10</td><td>Full board</td></tr><tr><td>11</td><td>Full breakfast</td></tr><tr><td>12</td><td>Half board/modified American plan</td></tr><tr><td>13</td><td>As brochured</td></tr><tr><td>14</td><td>Room only</td></tr><tr><td>15</td><td>Self catering</td></tr><tr><td>16</td><td>Bermuda</td></tr><tr><td>17</td><td>Dinner bed and breakfast plan</td></tr><tr><td>18</td><td>Family American</td></tr><tr><td>19</td><td>Breakfast</td></tr><tr><td>20</td><td>Modified</td></tr><tr><td>21</td><td>Lunch</td></tr><tr><td>22</td><td>Dinner</td></tr><tr><td>23</td><td>Breakfast &#x26; lunch</td></tr><tr><td>24</td><td>Lunch and Dinner</td></tr></tbody></table>


# OpenTravel Codes List

### Additional Detail Type (ADT) <a href="#additional-detail-type-adt" id="additional-detail-type-adt"></a>

<table><thead><tr><th width="167">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Rate description</td></tr><tr><td>2</td><td>Property description</td></tr><tr><td>3</td><td>Property location</td></tr><tr><td>4</td><td>Room information</td></tr><tr><td>5</td><td>Guarantee information</td></tr><tr><td>6</td><td>Deposit information</td></tr><tr><td>7</td><td>Cancellation information</td></tr><tr><td>8</td><td>Check in check out information</td></tr><tr><td>9</td><td>Extra charge information</td></tr><tr><td>10</td><td>Tax information</td></tr><tr><td>11</td><td>Service charge information</td></tr><tr><td>12</td><td>Package information</td></tr><tr><td>13</td><td>Commission information</td></tr><tr><td>14</td><td>Miscellaneous information</td></tr><tr><td>15</td><td>Promotional information</td></tr><tr><td>16</td><td>Inclusion information</td></tr><tr><td>17</td><td>Amenity information</td></tr><tr><td>18</td><td>Late arrival information</td></tr><tr><td>19</td><td>Late departure information</td></tr><tr><td>20</td><td>Advanced booking information</td></tr><tr><td>21</td><td>Extra person information</td></tr><tr><td>22</td><td>Areas served</td></tr><tr><td>23</td><td>Onsite facilities information</td></tr><tr><td>24</td><td>Offsite facilities information</td></tr><tr><td>25</td><td>Onsite services information</td></tr><tr><td>26</td><td>Offsite services information</td></tr><tr><td>27</td><td>Extended stay information</td></tr><tr><td>28</td><td>Corporate booking information</td></tr><tr><td>29</td><td>Booking guidelines</td></tr><tr><td>30</td><td>Government booking policy</td></tr><tr><td>31</td><td>Group booking information</td></tr><tr><td>32</td><td>Rate disclaimer information</td></tr><tr><td>33</td><td>Visa/travel requirement information</td></tr><tr><td>34</td><td>Security information</td></tr><tr><td>35</td><td>Onsite recreational activities information</td></tr><tr><td>36</td><td>Offsite recreational activities information</td></tr><tr><td>37</td><td>General meeting planning information</td></tr><tr><td>38</td><td>Group meeting planning information</td></tr><tr><td>39</td><td>Contract/negotiated booking information</td></tr><tr><td>40</td><td>Travel industry booking information</td></tr><tr><td>41</td><td>Meeting room description</td></tr><tr><td>42</td><td>Pet policy description</td></tr><tr><td>43</td><td>Meal plan description</td></tr><tr><td>44</td><td>Family plan description</td></tr><tr><td>45</td><td>Children information</td></tr><tr><td>46</td><td>Early checkout description</td></tr><tr><td>47</td><td>Special offers description</td></tr><tr><td>48</td><td>Catering description</td></tr><tr><td>49</td><td>Room decor description</td></tr><tr><td>50</td><td>Oversold policy description</td></tr><tr><td>51</td><td>Last room availability description</td></tr><tr><td>52</td><td>Room type upgrade description</td></tr><tr><td>53</td><td>Driving directions</td></tr><tr><td>54</td><td>Driving directions from the north</td></tr><tr><td>55</td><td>Driving directions from the south</td></tr><tr><td>56</td><td>Driving directions from the east</td></tr><tr><td>57</td><td>Driving directions from the west</td></tr><tr><td>58</td><td>Surcharge information</td></tr><tr><td>59</td><td>Minimum stay information</td></tr><tr><td>60</td><td>Maximum stay information</td></tr><tr><td>61</td><td>Check-in policy</td></tr><tr><td>62</td><td>Check-out policy</td></tr><tr><td>63</td><td>Express check-in policy</td></tr><tr><td>64</td><td>Express check-out policy</td></tr><tr><td>65</td><td>Facility restrictions</td></tr><tr><td>66</td><td>Customs information for material</td></tr><tr><td>67</td><td>Seasons</td></tr><tr><td>68</td><td>Food and beverage minimums for groups</td></tr><tr><td>69</td><td>Deposit policy for master account</td></tr><tr><td>70</td><td>Deposit policy for reservations</td></tr><tr><td>71</td><td>Restaurant services</td></tr><tr><td>72</td><td>Special events</td></tr><tr><td>73</td><td>Cuisine description</td></tr></tbody></table>

### Age Qualifying Code (AQC)

<table><thead><tr><th width="137">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Over 21</td></tr><tr><td>2</td><td>Over 65</td></tr><tr><td>3</td><td>Under 2</td></tr><tr><td>4</td><td>Under 12</td></tr><tr><td>5</td><td>Under 17</td></tr><tr><td>6</td><td>Under 21</td></tr><tr><td>7</td><td>Infant</td></tr><tr><td>8</td><td>Child</td></tr><tr><td>9</td><td>Teenager</td></tr><tr><td>10</td><td>Adult</td></tr><tr><td>11</td><td>Senior</td></tr><tr><td>12</td><td>Additional occupant with adult</td></tr><tr><td>13</td><td>Additional occupant without adult</td></tr><tr><td>14</td><td>Free child</td></tr><tr><td>15</td><td>Free adult</td></tr><tr><td>16</td><td>Young driver</td></tr><tr><td>17</td><td>Younger driver</td></tr><tr><td>18</td><td>Under 10</td></tr><tr><td>19</td><td>Junior</td></tr></tbody></table>

### Booking Channel Type (BCT)

<table><thead><tr><th width="100">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Global distribution system (GDS)</td></tr><tr><td>2</td><td>Alternative distribution system (ADS)</td></tr><tr><td>3</td><td>Sales and catering system (SCS)</td></tr><tr><td>4</td><td>Property management system (PMS)</td></tr><tr><td>5</td><td>Central reservation system (CRS)</td></tr><tr><td>6</td><td>Tour operator system (TOS)</td></tr><tr><td>7</td><td>Internet</td></tr><tr><td>8</td><td>Kiosk</td></tr><tr><td>9</td><td>Agent</td></tr></tbody></table>

### Communication Location Type (CLT)

<table><thead><tr><th width="145">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Home</td></tr><tr><td>2</td><td>Business</td></tr><tr><td>3</td><td>Other</td></tr><tr><td>4</td><td>Destination</td></tr></tbody></table>

### Email Address Type (EAT)

<table><thead><tr><th width="100">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Personal</td></tr><tr><td>2</td><td>Business</td></tr><tr><td>3</td><td>Listserve</td></tr><tr><td>4</td><td>Internet</td></tr><tr><td>5</td><td>Property</td></tr><tr><td>6</td><td>Sales office</td></tr><tr><td>7</td><td>Reservation office</td></tr><tr><td>8</td><td>Managing company</td></tr></tbody></table>

### Fee Tax Type (FTT)

<table><thead><tr><th width="147">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Bed tax</td></tr><tr><td>2</td><td>City hotel fee</td></tr><tr><td>3</td><td>City tax</td></tr><tr><td>4</td><td>County tax</td></tr><tr><td>5</td><td>Energy tax</td></tr><tr><td>6</td><td>Federal tax</td></tr><tr><td>7</td><td>Food &#x26; beverage tax</td></tr><tr><td>8</td><td>Lodging tax</td></tr><tr><td>9</td><td>Maintenance fee</td></tr><tr><td>10</td><td>Occupancy tax</td></tr><tr><td>11</td><td>Package fee</td></tr><tr><td>12</td><td>Resort fee</td></tr><tr><td>13</td><td>Sales tax</td></tr><tr><td>14</td><td>Service charge</td></tr><tr><td>15</td><td>State tax</td></tr><tr><td>16</td><td>Surcharge</td></tr><tr><td>17</td><td>Total tax</td></tr><tr><td>18</td><td>Tourism tax</td></tr><tr><td>19</td><td>VAT/GST tax</td></tr><tr><td>20</td><td>Surplus Lines Tax</td></tr><tr><td>21</td><td>Insurance Premium Tax</td></tr><tr><td>22</td><td>Application Fee</td></tr><tr><td>23</td><td>Express Handling Fee</td></tr><tr><td>24</td><td>Exempt</td></tr><tr><td>25</td><td>Standard</td></tr><tr><td>26</td><td>Zero-rated</td></tr><tr><td>27</td><td>Miscellaneous</td></tr><tr><td>28</td><td>Room Tax</td></tr><tr><td>29</td><td>Early checkout fee</td></tr><tr><td>30</td><td>Country tax</td></tr><tr><td>31</td><td>Extra person charge</td></tr><tr><td>32</td><td>Banquet service fee</td></tr><tr><td>33</td><td>Room service fee</td></tr><tr><td>34</td><td>Local fee</td></tr><tr><td>35</td><td>Goods and services tax (GST)</td></tr><tr><td>36</td><td>Value Added Tax (VAT)</td></tr><tr><td>37</td><td>Crib fee</td></tr><tr><td>38</td><td>Rollaway fee</td></tr><tr><td>39</td><td>Assessment/license tax</td></tr><tr><td>40</td><td>Pet sanitation fee</td></tr><tr><td>41</td><td>Not known</td></tr><tr><td>42</td><td>Child rollaway charge</td></tr><tr><td>43</td><td>Convention tax</td></tr><tr><td>44</td><td>Extra child charge</td></tr><tr><td>45</td><td>Standard food and beverage gratuity</td></tr><tr><td>46</td><td>National government tax</td></tr><tr><td>47</td><td>Adult rollaway fee</td></tr><tr><td>48</td><td>Beverage with alcohol</td></tr><tr><td>49</td><td>Beverage without alcohol</td></tr><tr><td>50</td><td>Tobacco</td></tr><tr><td>51</td><td>Food</td></tr><tr><td>52</td><td>Total surcharges</td></tr><tr><td>53</td><td>State cost recovery fee</td></tr><tr><td>54</td><td>Miscellaneous fee</td></tr><tr><td>55</td><td>Destination amenity fee</td></tr></tbody></table>

### Meal Plan Type (MPT)

<table><thead><tr><th width="146">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>All inclusive</td></tr><tr><td>2</td><td>American/full board</td></tr><tr><td>3</td><td>Bed &#x26; breakfast</td></tr><tr><td>4</td><td>Buffet breakfast</td></tr><tr><td>5</td><td>Caribbean breakfast</td></tr><tr><td>6</td><td>Continental breakfast</td></tr><tr><td>7</td><td>English breakfast</td></tr><tr><td>8</td><td>European plan</td></tr><tr><td>9</td><td>Family plan</td></tr><tr><td>10</td><td>Full board</td></tr><tr><td>11</td><td>Full breakfast</td></tr><tr><td>12</td><td>Half board/modified American plan</td></tr><tr><td>13</td><td>As brochured</td></tr><tr><td>14</td><td>Room only/European plan</td></tr><tr><td>15</td><td>Self catering</td></tr><tr><td>16</td><td>Bermuda</td></tr><tr><td>17</td><td>Dinner bed and breakfast plan</td></tr><tr><td>18</td><td>Family American</td></tr><tr><td>19</td><td>Breakfast</td></tr><tr><td>20</td><td>Modified</td></tr><tr><td>21</td><td>Lunch</td></tr><tr><td>22</td><td>Dinner</td></tr><tr><td>23</td><td>Breakfast &#x26; lunch</td></tr></tbody></table>

### Name Type (NAM)

<table><thead><tr><th width="142">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Former</td></tr><tr><td>2</td><td>Nickname</td></tr><tr><td>3</td><td>Alternate</td></tr><tr><td>4</td><td>Maiden</td></tr></tbody></table>

### Phone Location Type (PLT)

<table><thead><tr><th width="148">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Brand reservations office</td></tr><tr><td>2</td><td>Central reservations office</td></tr><tr><td>3</td><td>Property reservation Office</td></tr><tr><td>4</td><td>Property direct</td></tr><tr><td>5</td><td>Sales office</td></tr><tr><td>6</td><td>Home</td></tr><tr><td>7</td><td>Office</td></tr><tr><td>8</td><td>Other</td></tr><tr><td>9</td><td>Managing company</td></tr><tr><td>10</td><td>Mobile</td></tr></tbody></table>

### Phone Technology Type (PTT)

<table><thead><tr><th width="140">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Voice</td></tr><tr><td>2</td><td>Data</td></tr><tr><td>3</td><td>Fax</td></tr><tr><td>4</td><td>Pager</td></tr><tr><td>5</td><td>Mobile</td></tr><tr><td>6</td><td>TTY</td></tr><tr><td>7</td><td>Telex</td></tr><tr><td>8</td><td>Voice over IP</td></tr></tbody></table>

### Profile Type (PRT)

<table><thead><tr><th width="141">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Customer</td></tr><tr><td>2</td><td>GDS</td></tr><tr><td>3</td><td>Corporation</td></tr><tr><td>4</td><td>Travel agent</td></tr><tr><td>5</td><td>Wholesaler</td></tr><tr><td>6</td><td>Group</td></tr><tr><td>7</td><td>Tour operator</td></tr><tr><td>8</td><td>CRO</td></tr><tr><td>9</td><td>Representation company</td></tr><tr><td>10</td><td>Internet broker</td></tr><tr><td>11</td><td>Airline</td></tr><tr><td>12</td><td>Hotel</td></tr><tr><td>13</td><td>Car rental</td></tr><tr><td>14</td><td>Cruise line</td></tr><tr><td>15</td><td>Employee</td></tr><tr><td>16</td><td>Event host</td></tr><tr><td>17</td><td>Supplier partner</td></tr><tr><td>18</td><td>Billing contact</td></tr><tr><td>19</td><td>Authorized signer</td></tr><tr><td>20</td><td>General service contractor</td></tr><tr><td>21</td><td>Arranger</td></tr><tr><td>22</td><td>Association</td></tr><tr><td>23</td><td>Travel agency</td></tr></tbody></table>

### Segment Category Code (SEG)

<table><thead><tr><th width="138">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>All suite</td></tr><tr><td>2</td><td>Budget</td></tr><tr><td>3</td><td>Corporate business transient</td></tr><tr><td>4</td><td>Deluxe</td></tr><tr><td>5</td><td>Economy</td></tr><tr><td>6</td><td>Extended stay</td></tr><tr><td>7</td><td>First class</td></tr><tr><td>8</td><td>Luxury</td></tr><tr><td>9</td><td>Meeting/Convention</td></tr><tr><td>10</td><td>Moderate</td></tr><tr><td>11</td><td>Residential apartment</td></tr><tr><td>12</td><td>Resort</td></tr><tr><td>13</td><td>Tourist</td></tr><tr><td>14</td><td>Upscale</td></tr><tr><td>15</td><td>Efficiency</td></tr><tr><td>16</td><td>Standard</td></tr><tr><td>17</td><td>Midscale</td></tr><tr><td>18</td><td>Moderate 2</td></tr><tr><td>19</td><td>Quality</td></tr><tr><td>20</td><td>Quality 2</td></tr><tr><td>21</td><td>Unknown</td></tr><tr><td>22</td><td>Midscale without F&#x26;B</td></tr><tr><td>23</td><td>Upper upscale</td></tr></tbody></table>

### Unique ID Type (UIT)

<table><thead><tr><th width="145">Code Value</th><th>Code Name</th></tr></thead><tbody><tr><td>1</td><td>Customer</td></tr><tr><td>2</td><td>CRO (Customer Reservations Office)</td></tr><tr><td>3</td><td>Corporation representative</td></tr><tr><td>4</td><td>Company</td></tr><tr><td>5</td><td>Travel agency</td></tr><tr><td>6</td><td>Airline</td></tr><tr><td>7</td><td>Wholesaler</td></tr><tr><td>8</td><td>Car rental</td></tr><tr><td>9</td><td>Group</td></tr><tr><td>10</td><td>Hotel</td></tr><tr><td>11</td><td>Tour operator</td></tr><tr><td>12</td><td>Cruise line</td></tr><tr><td>13</td><td>Internet broker</td></tr><tr><td>14</td><td>Reservation</td></tr><tr><td>15</td><td>Cancellation</td></tr><tr><td>16</td><td>Reference</td></tr><tr><td>17</td><td>Meeting planning agency</td></tr><tr><td>18</td><td>Other</td></tr><tr><td>19</td><td>Insurance agency</td></tr><tr><td>20</td><td>Insurance agent</td></tr><tr><td>21</td><td>Profile</td></tr><tr><td>22</td><td>ERSP (Electronic reservation service provider)</td></tr><tr><td>23</td><td>Provisional reservation</td></tr><tr><td>24</td><td>Travel Agent PNR</td></tr><tr><td>25</td><td>Associated reservation</td></tr><tr><td>26</td><td>Associated itinerary reservation</td></tr><tr><td>27</td><td>Associated shared reservation</td></tr><tr><td>28</td><td>Alliance</td></tr><tr><td>29</td><td>Booking agent</td></tr><tr><td>30</td><td>Ticket</td></tr><tr><td>31</td><td>Divided reservation</td></tr><tr><td>32</td><td>Merchant</td></tr><tr><td>33</td><td>Acquirer</td></tr><tr><td>34</td><td>Master reference</td></tr><tr><td>35</td><td>Purged master reference</td></tr><tr><td>36</td><td>Parent reference</td></tr><tr><td>37</td><td>Child reference</td></tr><tr><td>38</td><td>Linked reference</td></tr><tr><td>39</td><td>Contract</td></tr><tr><td>40</td><td>Confirmation number</td></tr><tr><td>41</td><td>Fare quote</td></tr><tr><td>42</td><td>Reissue/refund quote</td></tr><tr><td>43</td><td>Ground transportation supplier</td></tr><tr><td>44</td><td>EMD</td></tr></tbody></table>


# Payment Card Provider Codes

Identifies codes for various payment card providers.

<table data-full-width="false"><thead><tr><th width="110">Code</th><th width="644">Type</th></tr></thead><tbody><tr><td>AX</td><td>American Express</td></tr><tr><td>BC</td><td>Bank Card</td></tr><tr><td>BL</td><td>Carte Bleu</td></tr><tr><td>CB</td><td>Carte Blanche</td></tr><tr><td>DN</td><td>Diners Club</td></tr><tr><td>DS</td><td>Discover Card</td></tr><tr><td>EC</td><td>Eurocard</td></tr><tr><td>JC</td><td>Japanese Credit Bureau Credit Card</td></tr><tr><td>LC</td><td>Local Card</td></tr><tr><td>MA</td><td>Maestro</td></tr><tr><td>MC</td><td>Master Card</td></tr><tr><td>SO</td><td>Solo</td></tr><tr><td>CU</td><td>Union Pay</td></tr><tr><td>TP</td><td>Universal Air Travel Card</td></tr><tr><td>VE</td><td>Visa Electron</td></tr><tr><td>VI</td><td>VIsa</td></tr></tbody></table>


# Service and Extra Charge

Contains ServiceInventoryCode for additional services or charges.

For channels/OTA's under **SiteConnect API**: Use this list as a guide to code your extras/services. You can use additional codes not on the list such as PARKING or your own service identifier codes generated in your system.

For PMSs under **pmsXchange API**: Channels/OTA's will use this list as a guide to code the extras/services or can use their own codes as well. Please request the property or the channel for the full list of extras/services and the codes.

<table><thead><tr><th width="185">Type</th><th width="480">Description</th></tr></thead><tbody><tr><td>EXTRA_PERSON</td><td>Charges related to extra people</td></tr><tr><td>EXTRA_BED</td><td>Extra bed charges</td></tr><tr><td>SURCHARGE</td><td>Surcharges, for example credit card surcharge</td></tr><tr><td>MEAL</td><td>Charges related to the meal</td></tr><tr><td>SERVICE</td><td>General hotel nominated service charges</td></tr><tr><td>TOUR</td><td>Charges for a tour</td></tr><tr><td>EVENT</td><td>Charges for an event</td></tr><tr><td>EXTRA</td><td>Un-categorised extra added to the reservation</td></tr><tr><td>OTHER</td><td>Any additional charge that does not fall under the above categories, where OTHER is specified more information will be provided in the description</td></tr></tbody></table>


# Strong Customer Authentication Codes

Lists codes for authentication types required for secure transactions.

### Electronic Commerce Indicator

<table><thead><tr><th width="130">Value</th><th>Definition</th></tr></thead><tbody><tr><td>02 or 05</td><td>Fully Authenticated Transaction</td></tr><tr><td>01 or 06</td><td>Attempted Authentication Transaction</td></tr><tr><td>00 or 07</td><td>Non 3-D Secure Transaction</td></tr><tr><td>02, 01, 00</td><td>Mastercard</td></tr><tr><td>05, 06, 07</td><td>Visa</td></tr><tr><td>05, 06, 07</td><td>Amex</td></tr><tr><td>05, 06, 07</td><td>JCB</td></tr><tr><td>05, 06, 07</td><td>Diners</td></tr></tbody></table>

### Transactions Status Result Identifier

<table><thead><tr><th width="133">Value</th><th>Definition</th></tr></thead><tbody><tr><td>Y</td><td>Successful Authentication</td></tr><tr><td>N</td><td>Failed Authentication</td></tr><tr><td>U</td><td>Unable to Complete Authentication</td></tr><tr><td>A</td><td>Successful Attempts Transaction</td></tr><tr><td>B</td><td>You can proceed to authorisation using the information received</td></tr><tr><td>R</td><td>Authentication Rejected (Merchant must not submit for authorisation)</td></tr></tbody></table>

### Transaction Signature Status

<table><thead><tr><th width="134">Value</th><th>Definition</th></tr></thead><tbody><tr><td>Y</td><td>Indicates that the signature of the PARes has been validated successfully and the message contents can be trusted.</td></tr><tr><td>N</td><td>Indicates that the PARes could not be validated. This result could be for a variety of reasons; tampering, certificate expiration, etc., and the result should not be trusted.</td></tr><tr><td>null</td><td>If not sent then null</td></tr></tbody></table>

### Status of Authentication

<table><thead><tr><th width="136">Value</th><th>Definition</th></tr></thead><tbody><tr><td>Y</td><td>Yes, Bank is participating in 3-D Secure protocol and will return the ACSUrl</td></tr><tr><td>N</td><td>No, Bank is not participating in 3-D Secure protocol</td></tr><tr><td>U</td><td>Unavailable, The DS or ACS is not available for authentication at the time of the request</td></tr><tr><td>B</td><td>Bypass, Merchant authentication rule is triggered to bypass authentication in this use case</td></tr></tbody></table>


# Test Credit Cards

Mock data for simulating payment transactions during reservation testing.

**Card Holder Name:** Any value\
**CVV:** Any value\
**Expiration date:** Any date in the future\
**Amount:** Any value\
**Card Number:**

| Type                               | Card Number                                                                                                                                                                                         |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| American Express                   | <p><code>3782 8224 6310 0005</code></p><p><code>3782 0000 1111 2222</code></p>                                                                                                                      |
| Bank Card                          | <p><code>5555 5555 5555 4444</code></p><p><code>5555 1111 2222 6666</code></p>                                                                                                                      |
| Carte Bleu                         | <p><code>5555 6666 8888 9999</code></p><p><code>5555 5555 5555 4444</code></p>                                                                                                                      |
| Carte Blanche                      | <p><code>3056 9309 0259 04</code></p><p><code>3056 1111 2222 33</code></p>                                                                                                                          |
| Diners Club                        | <p><code>3056 9300 0902 0004</code></p><p><code>3056 9311 2111 3222</code></p><p><code>3852 0000 0232 37</code></p>                                                                                 |
| Discover Card                      | <p><code>6011 1111 1111 1117</code></p><p><code>6011 0009 9013 9424</code></p>                                                                                                                      |
| Eurocard                           | <p><code>5100 0000 1111 3333</code></p><p><code>5473 0000 0000 0007</code></p>                                                                                                                      |
| Japanese Credit Bureau Credit Card | <p><code>3566 0020 2036 0505</code></p><p><code>3530 1113 3330 0000</code></p>                                                                                                                      |
| Local Card                         | <p><code>1234 4567 7890 4222</code></p><p><code>9890 6555 7777 8888</code></p>                                                                                                                      |
| Maestro                            | <p><code>6759 6498 2643 8453</code><br><code>6799 9901 0000 0000</code></p>                                                                                                                         |
| Master Card                        | <p><code>5555 5555 5555 4444</code></p><p><code>5200 0078 4000 0022</code></p><p><code>5506 9274 2731 7625</code></p><p><code>5506 9208 0924 3667</code></p>                                        |
| Solo                               | <p><code>6334 0000 1111 2222</code></p><p><code>6767 0000 1111 4444</code></p>                                                                                                                      |
| Union Pay                          | <p><code>6200 0000 0000 0005</code></p><p><code>6200 5555 6666 7777</code></p>                                                                                                                      |
| Universal Air Travel Card          | <p><code>1000 70000 000112</code></p><p><code>1000 70000 000155</code></p><p><code>1000 88888 000155</code></p>                                                                                     |
| Visa Electron                      | <p><code>4917 3000 0000 0008</code></p><p><code>4917 1111 2222 3333</code></p>                                                                                                                      |
| VIsa                               | <p><code>4242 4242 4242 4242</code></p><p><code>4000 0019 6000 0008</code></p><p><code>4035 5010 0000 0008</code></p><p><code>4000 0200 0000 0000</code></p><p><code>4111 1111 1111 1111</code></p> |


# Changelog

Stay up to date with the latest changes, enhancements, and fixes for the SiteConnect API.

### 2024

{% updates format="full" %}
{% update date="2024-06-19" tags="added,reservations" %}

## <sup>Net or Gross Reservation / Commission Percentage</sup>

When `includesCommission` is set, all `RoomRate` and `RoomStay` level totals will be considered as **Net** or **Gross** amounts based on this value. Properties can enable reservation commission percentage to add a commission to the totals sent to the PMS for NET rates. More details in [ReservationTotal](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/channels-siteconnect/api-reference/reservations#reservationtotal).

{% code overflow="wrap" expandable="true" %}

```xml
<ResGlobalInfo>
    ...
	<Total CurrencyCode="AUD" AmountBeforeTax="462.73" AmountAfterTax="509.00">
		<Taxes>
			<Tax Amount="46.27" CurrencyCode="AUD"/>
		</Taxes>
		<TPA_Extensions>
			<Total includesCommission="true"/>
		</TPA_Extensions>
	</Total>
    ...
</ResGlobalInfo>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2023

{% updates format="full" %}
{% update date="2023-07-06" tags="added,restrictions" %}

## <sup>Minimum Stay Through / Maximum Stay Through</sup>

Property can decide if `LengthOfStay` `MinMaxMessageType` is on arrival (`SetMinLOS` / `SetMaxLOS`) or through (`SetForwardMinStay` / `SetForwardMaxStay`). More details in [Availability and Restrictions](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/channels-siteconnect/api-reference/availability-and-restrictions).

{% code overflow="wrap" expandable="true" %}

```xml
<AvailStatusMessage>
	<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
	<LengthsOfStay>
		<LengthOfStay MinMaxMessageType="SetForwardMinStay" Time="1"/>
		<!-- Min Length of Stay -->
		<LengthOfStay MinMaxMessageType="SetForwardMaxStay" Time="3"/>
		<!-- Max Length of Stay -->
	</LengthsOfStay>
</AvailStatusMessage>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2022

{% updates format="full" %}
{% update date="2022-03-14" tags="added,rates" %}

## <sup>Occupancy Based Pricing</sup>

The booking channel can support now Occupancy Based Pricing (OBP), instead of Per Day Pricing (PDP). More details in [Rates](https://siteminder-apis-beta-upgrade.gitbook.io/siteminder-apis-new/DOKB3juwFiYhvklwuL1W/channels-siteconnect/api-reference/rates).

{% code overflow="wrap" expandable="true" %}

```xml
<Rates>
	<Rate>
		<BaseByGuestAmts>
			<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="100.00" CurrencyCode="EUR" NumberOfGuests="1"/>
			<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="200.00" CurrencyCode="EUR" NumberOfGuests="2"/>
			<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="300.00" CurrencyCode="EUR" NumberOfGuests="3"/>
			<BaseByGuestAmt AgeQualifyingCode="10" AmountAfterTax="400.00" CurrencyCode="EUR" NumberOfGuests="4"/>
			<!-- Additional BaseByGuestAmt elements -->
		</BaseByGuestAmts>
		<AdditionalGuestAmounts>
			<AdditionalGuestAmount AgeQualifyingCode="8" Amount="50" CurrencyCode="EUR"/>
			<!-- Extra Child Rate -->
		</AdditionalGuestAmounts>
		<RateDescription>
			<Text>Contemporary 1 Bedroom Apartment with private balcony.</Text>
			<!-- Inclusions -->
		</RateDescription>
	</Rate>
</Rates>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2020

{% updates format="full" %}
{% update date="2020-09-08" tags="added,reservations" %}

## <sup>Virtual Credit Card</sup>

Extra information about Virtual Credit Cards can now be included with a Payment Card in a reservation. More details in [Guarantee](https://developer.siteminder.com/sm-apis/channels/siteconnect/api-reference/reservations#guarantee) and [DepositPayments](depositpayhttps://developer.siteminder.com/sm-apis/channels/siteconnect/api-reference/reservations#depositpaymentsments).

{% code overflow="wrap" expandable="true" %}

```xml
<Guarantee>
	<GuaranteesAccepted>
		<GuaranteeAccepted>
			<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
				<CardHolderName>John Smith</CardHolderName>
				<TPA_Extensions>
					<VirtualCreditCard isVCC="true" VCCActivationDate="2024-09-05" VCCCurrencyCode="EUR" VCCCurrentBalance="620.00" VCCDeactivationDate="2024-10-08"/>
				</TPA_Extensions>
			</PaymentCard>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
</Guarantee>
```

{% endcode %}
{% endupdate %}

{% update date="2020-08-28" tags="added,reservations" %}

## <sup>Guest Count Ages</sup>

Ages can now be included within reservation guest counts. More details in [GuestCounts](https://developer.siteminder.com/sm-apis/channels/siteconnect/api-reference/reservations#guestcounts).

{% code overflow="wrap" expandable="true" %}

```xml
<GuestCounts>
	<GuestCount AgeQualifyingCode="10" Count="2"/>
	<GuestCount AgeQualifyingCode="8" Age="7" Count="1"/>
	<GuestCount AgeQualifyingCode="8" Age="10" Count="1"/>
	<GuestCount AgeQualifyingCode="7" Count="1"/>
	<!-- Additional GuestCount elements -->
</GuestCounts>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2019

{% updates format="full" %}
{% update date="2019-11-06" tags="modified,reservations" %}

## <sup>CVV/CVC of a Payment Card</sup> <a href="#h_1a63c83e34" id="h_1a63c83e34"></a>

Payment card series codes (CVV or CVC) will now be provided only in the Reservation Notification Email.
{% endupdate %}

{% update date="2019-09-13" tags="added,reservations" %}

## <sup>Strong Customer Authentication (SCA)</sup>

Three Domain Security (3DS) data can now be delivered in reservations alongside payment card data. More details in [Guarantee](https://developer.siteminder.com/sm-apis/channels/siteconnect/api-reference/reservations#guarantee) and [DepositPayments](depositpayhttps://developer.siteminder.com/sm-apis/channels/siteconnect/api-reference/reservations#depositpaymentsments).

{% code overflow="wrap" expandable="true" %}

```xml
<Guarantee>
	<GuaranteesAccepted>
		<GuaranteeAccepted>
			<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
				<CardHolderName>John Smith</CardHolderName>
				<ThreeDomainSecurity>
					<Results ThreeDSVersion="1.0.2" XID="z9UKb06xLziZMOXBEmWSVA1kwG0=" CAVV="MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=" ECI="05" />
				</ThreeDomainSecurity>
			</PaymentCard>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
</Guarantee>
```

{% endcode %}
{% endupdate %}

{% update date="2019-06-04" tags="added,reservations" %}

## <sup>Guest ID Document</sup>

Guest profiles can now contain guest ID document details. More details in [ResGuests](https://developer.siteminder.com/sm-apis/channels/siteconnect/api-reference/reservations#resguests).

{% code overflow="wrap" expandable="true" %}

```xml
<ResGuests>
	<ResGuest ResGuestRPH="1" ArrivalTime="14:00:00" PrimaryIndicator="1">
		<Profiles>
			<ProfileInfo>
				<Profile ProfileType="1">
					<Customer>
						---
						<Document DocID="987654321P" DocType="5" DocHolderNationality="AU" BirthDate="1996-10-05" Gender="Male" BirthCountry="AU" BirthPlace="AU" EffectiveDate="2026-10-05" ExpireDate="2027-10-05" DocIssueAuthority="DAFT" DocIssueLocation="AU" DocIssueStateProv="AU" DocIssueCountry="AU">
							<DocHolderName>John Smith</DocHolderName>
						</Document>
					</Customer>
				</Profile>
			</ProfileInfo>
		</Profiles>
	</ResGuest>
</ResGuests>
```

{% endcode %}
{% endupdate %}

{% update date="2019-02-26" tags="added,reservations" %}

## <sup>Corporate Profile ID</sup>

Corporate profiles in reservations can now contain a UniqueID ID: 3

{% code overflow="wrap" expandable="true" %}

```xml
<ProfileInfo>
	<Profile ProfileType="3">
		<CompanyInfo>
			<UniqueID ID="CORP"/>
			<CompanyName>COMPANY</CompanyName>
			<TelephoneInfo PhoneNumber="0266564101"/>
			<Email>contact@company.com</Email>
			<AddressInfo>
				<AddressLine>3 George St</AddressLine>
				<AddressLine>CBD</AddressLine>
				<CityName>Sydney</CityName>
				<PostalCode>2000</PostalCode>
				<StateProv>NSW</StateProv>
				<CountryName>Australia</CountryName>
			</AddressInfo>
		</CompanyInfo>
	</Profile>
</ProfileInfo>
```

{% endcode %}
{% endupdate %}

{% update date="2019-02-26" tags="added,restrictions" %}

## <sup>Maximum Length of Stay</sup>

Maximum stay can now be sent with restriction updates.

{% code overflow="wrap" %}

```xml
<AvailStatusMessage>
	<StatusApplicationControl End="2024-10-05" InvTypeCode="SGL" RatePlanCode="BAR" Start="2024-10-05"/>
	<LengthsOfStay>
		<LengthOfStay MinMaxMessageType="SetMinLOS" Time="1"/>
		<!-- Min Length of Stay -->
		<LengthOfStay MinMaxMessageType="SetMaxLOS" Time="3"/>
		<!-- Max Length of Stay -->
	</LengthsOfStay>
</AvailStatusMessage>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2018

{% updates format="full" %}
{% update date="2022-12-01" tags="added,reservations" %}

## <sup>AmountBeforeTax</sup>

The Reservation API now has the ability to accept only AmountBeforeTax, instead of requiring AmountAfterTax to be always set.

{% code overflow="wrap" %}

```xml
<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
	<Taxes>
		<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
		<!-- Additional Tax elements -->
	</Taxes>
</Total>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2017

{% updates format="full" %}
{% update date="2017-05-24" tags="added,reservations" %}

## <sup>Services</sup>

We extended the Reservation API with the ability to provide Services information. Please see relevant additions to both Services and RoomStay below.

{% code overflow="wrap" expandable="true" %}

```xml
<Services>
    <Service ServiceInventoryCode="OTHER" Inclusive="true" Quantity="1" ID="12346">
        <Price>
            <Base AmountBeforeTax="10.00" AmountAfterTax="11.00" CurrencyCode="EUR"/>
            <Total AmountBeforeTax="30.00" AmountAfterTax="33.00" CurrencyCode="EUR"/>
            <RateDescription>
                <Text>Parking for 1 vehicle per night</Text>
            </RateDescription>
        </Price>
        <ServiceDetails>
            <TimeSpan Start="2025-10-05" End="2025-10-08"/>
        </ServiceDetails>
    </Service>
</Services>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2016

{% updates format="full" %}
{% update date="2016-06-30" tags="added,reservations" %}

## <sup>Company and Travel Agent</sup>

We extended the Reservation API with the ability to provide Company and Travel Agent information. See spec for more details on this functionality.

{% code title="Company" overflow="wrap" expandable="true" %}

```xml
<ProfileInfo>
	<Profile ProfileType="3">
		<CompanyInfo>
			<UniqueID ID="CORP"/>
			<CompanyName>COMPANY</CompanyName>
			<TelephoneInfo PhoneNumber="0266564101"/>
			<Email>contact@company.com</Email>
			<AddressInfo>
				<AddressLine>3 George St</AddressLine>
				<AddressLine>CBD</AddressLine>
				<CityName>Sydney</CityName>
				<PostalCode>2000</PostalCode>
				<StateProv>NSW</StateProv>
				<CountryName>Australia</CountryName>
			</AddressInfo>
		</CompanyInfo>
	</Profile>
</ProfileInfo>
```

{% endcode %}

{% code title="Travel Agent" overflow="wrap" expandable="true" %}

```xml
<ProfileInfo>
	<Profile ProfileType="4">
		<UniqueID ID="56789"/>
		<CompanyInfo>
			<CompanyName>TRAVEL AGENT LTD</CompanyName>
			<TelephoneInfo PhoneNumber="0266564100"/>
			<Email>contact@travelagent.com</Email>
			<AddressInfo>
				<AddressLine>4 George St</AddressLine>
				<AddressLine>CBD</AddressLine>
				<CityName>Sydney</CityName>
				<PostalCode>2000</PostalCode>
				<StateProv>NSW</StateProv>
				<CountryName>Australia</CountryName>
			</AddressInfo>
		</CompanyInfo>
	</Profile>
</ProfileInfo>
```

{% endcode %}
{% endupdate %}

{% update date="2016-04-04" tags="added,reservations" %}

## <sup>Additional Details</sup>

To better support character limitations to certain attributes in the the OTA Specifications, we've modified our 'Retrieve Rooms' API to include shorter character code within AdditionalDetails / AdditionalDetail / @Code (`NO_AVAILABILITY`, `NO_RATES`, `NO_UPDATES`).

{% code overflow="wrap" expandable="true" %}

```xml
<RatePlans>
	<RatePlan RatePlanCode="BAR">
		<RatePlanDescription Name="Best Available Rate">
			<Text>Best Available Rate.</Text>
		</RatePlanDescription>
		<AdditionalDetails>
			<AdditionalDetail Code="NO_RATES"/>
			<AdditionalDetail Code="NO_AVAILABILITY"/>
		</AdditionalDetails>
	</RatePlan>
</RatePlans>
```

{% endcode %}

{% code overflow="wrap" expandable="true" %}

```xml
<RatePlans>
	<RatePlan RatePlanCode="BAR">
		<RatePlanDescription Name="Best Available Rate">
			<Text>Best Available Rate.</Text>
		</RatePlanDescription>
		<AdditionalDetails>
			<AdditionalDetail Code="NO_UPDATES"/>
		</AdditionalDetails>
	</RatePlan>
</RatePlans>
```

{% endcode %}
{% endupdate %}
{% endupdates %}

### 2014

{% updates format="full" %}
{% update date="2014-07-31" tags="added,reservations" %}

## <sup>RoomRate / Rates / Rate / Total</sup>

This total is an important value as most PMS will only receive proper room rate values if this value is provided.

{% code overflow="wrap" expandable="true" %}

```xml
<RoomRates>
	<RoomRate RoomTypeCode="TPL" RatePlanCode="BAR" NumberOfUnits="1">
		<Rates>
			<Rate UnitMultiplier="1" RateTimeUnit="Day" EffectiveDate="2024-10-05" ExpireDate="2024-10-08">
				---
				<Total AmountBeforeTax="558.00" AmountAfterTax="620.00" CurrencyCode="EUR">
					<Taxes>
						<Tax Type="inclusive" Code="35" Amount="62.00" CurrencyCode="EUR"/>
						<!-- Additional Tax elements -->
					</Taxes>
				</Total>
			</Rate>
		</Rates>
    	---
	</RoomRate>
</RoomRates>
```

{% endcode %}
{% endupdate %}

{% update date="2014-07-03" tags="added,reservations" %}

## <sup>PaymentCard @CardCode</sup>

Payment card `CardCode` is now a mandatory field (if any `PaymentCard` details are sent) due to an issue found where the reservation will not be accepted by all PMSs if it is not included.

{% code overflow="wrap" expandable="true" %}

```xml
<Guarantee>
	<GuaranteesAccepted>
		<GuaranteeAccepted>
			<PaymentCard CardType="1" CardCode="MC" CardNumber="4321432143214321" SeriesCode="123" ExpireDate="1234">
				<CardHolderName>John Smith</CardHolderName>
			</PaymentCard>
		</GuaranteeAccepted>
	</GuaranteesAccepted>
</Guarantee>
```

{% endcode %}
{% endupdate %}

{% update date="2014-04-02" tags="added,reservations" %}

## <sup>Customer / CustLoyalty</sup>

Adding loyalty information for the guest.// Some code

{% code overflow="wrap" %}

```xml
<Customer>
	...
	<CustLoyalty ProgramID="LoyaltyProgramName" MembershipID="123456789" ExpireDate="2019-12-30">
</Customer>
```

{% endcode %}
{% endupdate %}

{% update date="2014-04-02" tags="added,reservations" %}

## <sup>ArrivalTransport / DepartureTransport</sup>

Adding TransportInfo for arrival and departure.

{% code overflow="wrap" %}

```xml
<ResGuest>
	<ArrivalTransport>
		<TransportInfo Time="2014-­01-12T14:00:00" Type="Air" ID="BA125"/>
	</ArrivalTransport>
	<DepartureTransport>
		<TransportInfo Time="2014-­01-16T17:00:00" Type="Air" ID="BA143"/>
	</DepartureTransport>
</ResGuest>
```

{% endcode %}
{% endupdate %}

{% update date="2014-04-02" tags="added,reservations" %}

## <sup>MealsIncluded MealPlanCodes</sup>

Adding meal plan information to the `RatePlan`.

{% code overflow="wrap" %}

```xml
<RatePlan>
	<MealsIncluded MealPlanCodes="Full board"/>
</RatePlan>
```

{% endcode %}
{% endupdate %}

{% update date="2014-10-23" tags="added,reservations" %}

## <sup>Customer / NamePrefix</sup>

Adding the title of the guest or customer to the reservation profiles.

{% code overflow="wrap" expandable="true" %}

```xml
<ResGuests>
	<ResGuest ResGuestRPH="1" ArrivalTime="14:00:00" PrimaryIndicator="1">
		<Profiles>
			<ProfileInfo>
				<Profile ProfileType="1">
					<Customer>
						<PersonName>
							<NamePrefix>Mr</NamePrefix>
							<GivenName>John</GivenName>
							<Surname>Smith</Surname>
```

{% endcode %}

{% code overflow="wrap" expandable="true" %}

```xml
<ResGlobalInfo>
	<Profiles>
		<ProfileInfo>
			<Profile>
				<Customer>
					<PersonName>
						<NamePrefix>Mr</NamePrefix>
						<GivenName>John</GivenName>
						<Surname>Smith</Surname>
```

{% endcode %}
{% endupdate %}
{% endupdates %}


# Channels Plus

Connect your booking channel to SiteMinder with Channels Plus — an API for real-time property search, availability, pricing, static content and media, providing everything you need to sell a property.

Channels Plus enables booking channels to connect to multiple SiteMinder properties through a single REST/JSON integration — without direct property contracts, billing setup, or manual onboarding. Channels shop rates and availability on demand and manage reservations directly, with access to the Partner Portal for property discovery, deal management, and API key control.

### Key Benefits

* **Effortless Integration:** Connect to multiple properties through a single REST/JSON API — no contracts or separate billing.
* **Real-Time Access:** Search availability, retrieve property content and pricing, and manage reservations instantly.
* **Partner Portal Access:** Discover properties, manage API keys, create deals, and track billed reservations.
* **Fast Time to Market:** Eliminate onboarding friction and go live faster with automated setup.

### Next Steps

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><h4><i class="fa-circle-bolt" style="color:blue;">:circle-bolt:</i></h4></td><td><strong>Quick Start</strong></td><td></td><td><a href="/pages/iOhKCrpXrBcy2gWC3jcL">/pages/iOhKCrpXrBcy2gWC3jcL</a></td></tr><tr><td><h4><i class="fa-signs-post" style="color:blue;">:signs-post:</i></h4></td><td><strong>Integration Requirements</strong></td><td></td><td><a href="/pages/P1hia9vBTbBEOX4dyyR5">/pages/P1hia9vBTbBEOX4dyyR5</a></td></tr><tr><td><h4><i class="fa-code" style="color:blue;">:code:</i></h4></td><td><strong>API Overview</strong></td><td></td><td><a href="/pages/uhPRnvUFxSZlVcjiQXPm">/pages/uhPRnvUFxSZlVcjiQXPm</a></td></tr></tbody></table>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Quick Start

Everything you need to begin building with Channels Plus API.

Channels Plus connects your booking channel with SiteMinder's distribution platform. Through Channels Plus, your channel can search for available properties, retrieve room and rate details, and manage bookings.

**API components:**

* **Properties**: Search and retrieve property details
* **Property**: Availability, pricing, and room configuration
* **Reservations**: Create, modify, and cancel reservations
* **Deals**: Negotiate competitive rates with properties

{% hint style="success" %}
Explore all components in the [API Overview](/channels-plus-api/guides/api-overview).
{% endhint %}

***

## Before You Begin

{% hint style="info" %}
**You don't need to wait for your test environment to start development.** You can begin building and testing immediately. See [Make Your First Call](#make-your-first-call) below or explore requests directly in the [Postman](#explore-with-postman) collection.
{% endhint %}

### Partnership Required

Access to Channels Plus requires an active partnership agreement with SiteMinder. Once your agreement is in place, you will receive your test environment details.

<a href="https://www.siteminder.com/integrations/apply-now/" class="button primary">Become a SiteMinder Partner</a>

### What You'll Receive from SiteMinder

When your integration begins, we'll send you an initiation email asking you to\
complete the Testing Setup form. This allows us to configure your\
access to the Partner Portal, where you'll generate your API ID and API Key.

<table><thead><tr><th width="171.01336669921875">Item</th><th>Details</th></tr></thead><tbody><tr><td>Channel endpoint</td><td><a href="https://tpi-channel-api.preprod.smchannelsplus.com/">https://tpi-channel-api.preprod.smchannelsplus.com/</a></td></tr><tr><td>Export endpoint</td><td><a href="https://tpi-export-api.preprod.smchannelsplus.com/">https://tpi-export-api.preprod.smchannelsplus.com/</a></td></tr><tr><td>Partner Portal</td><td>Access to generate your <code>API ID</code> and <code>API Key</code>, and to create Deals</td></tr></tbody></table>

## Set Up Your Environment

### Authentication

Channels Plus uses **channel-level authentication** — two headers on every request (`API ID` and `API Key`), both generated from the Partner Portal.

```bash
--header 'x-sm-api-id: YOUR_API_ID' \
--header 'x-sm-api-key: YOUR_API_KEY'
```

{% hint style="warning" %}
Keep your `API ID` and `API Key` private. Never expose them in front-end or client-side code. This API is for server-to-server use only.
{% endhint %}

### API Specification File

**REST (OpenAPI)**

* **Channels Plus** — [download YAML](https://openapi.gitbook.com/o/qrJuVY5UOf3h7cLyla8z/spec/channels-plus-api.yaml)
* **Channels Plus Export API** — [download YAML](https://openapi.gitbook.com/o/qrJuVY5UOf3h7cLyla8z/spec/channels-plus-export-api.yaml)

***

## Make Your First Call

The first call every Channels Plus integration must implement is [Get Properties](/channels-plus-api/reference/properties) — your channel retrieves a list of available properties from SiteMinder based on location and date criteria.

{% stepper %}
{% step %}

### Authenticate

Pass your `API ID` and `API Key` as headers on every request:

{% code overflow="wrap" expandable="true" %}

```bash
--header 'x-sm-api-id: YOUR_API_ID' \
--header 'x-sm-api-key: YOUR_API_KEY'
```

{% endcode %}

{% hint style="success" %}
Use SiteMinder's shared test credentials to make this call:

* **API ID**: `c258d726-e6fa-47a3-9ae8-e0290484bbe4`
* **API KEY**: `b7d92948-5b0b-4b38-a08e-f1c53eff2947`
* **Credentials** are pre-filled in the [Postman collection](#explore-with-postman) below.
  {% endhint %}
  {% endstep %}

{% step %}

### Make the call

Retrieve available properties by location and date:

{% code overflow="wrap" expandable="true" %}

```bash
curl -L \
  --url 'https://tpi-channel-api.preprod.smchannelsplus.com/properties?latitude=1&longitude=1&checkin=2026-04-07&checkout=2026-04-07' \
  --header 'x-sm-api-id: YOUR_API_ID' \
  --header 'x-sm-api-key: YOUR_API_KEY' \
  --header 'Accept: */*'
```

{% endcode %}
{% endstep %}

{% step %}

### Handle the response

A successful response returns an array of properties matching your search criteria, each including room types, rate plans, pricing, and commission details:

{% code overflow="wrap" expandable="true" %}

```json
[
  {
    "uuid": "text",
    "name": "text",
    "propertyType": { "text": "text", "language": "text" },
    "address": "text",
    "country": "text",
    "latitude": 1,
    "longitude": 1,
    "starRating": 1,
    "currency": "text",
    "totalCommissionPercentage": 1,
    "rooms": [
      {
        "roomRateUuid": "text",
        "ratePlanName": "text",
        "adults": 1,
        "cancellationPolicy": {
          "policyType": "non-refundable",
          "freeCancellationUntilDays": 1
        },
        "prices": [
          {
            "totalPrice": 1,
            "dealCode": "text",
            "totalCommissionPercentage": 1
          }
        ]
      }
    ]
  }
]
```

{% endcode %}
{% endstep %}

{% step %}

### Handle errors

If your API ID or API Key is missing or invalid:

{% code overflow="wrap" expandable="true" %}

```json
{
  "errors": [
    {
      "code": "text",
      "message": "text",
      "meta": {}
    }
  ]
}
```

{% endcode %}

{% hint style="danger" %}
**401** - Check your `x-sm-api-id` and `x-sm-api-key` headers are correct and present on every request.
{% endhint %}

{% code overflow="wrap" expandable="true" %}

```json
{
  "errors": [
    {
      "code": "text",
      "message": "text",
      "meta": {}
    }
  ]
}
```

{% endcode %}

{% hint style="danger" %}
**429** - The number of requests for the last 5 minutes has reached the limit for your channel. Wait before retrying.
{% endhint %}
{% endstep %}
{% endstepper %}

***

## Explore with Postman

SiteMinder's Channels Plus Postman workspace contains collections and environments to help you build, test, and validate your integration for certification. Fork the collections and environments to your own Postman account to get started.

→ [Channels Plus Postman Workspace](https://www.postman.com/siteminder-apis/channels-plus/overview)

### Shared Test Credentials

The **Channels Plus - API TEST** environment is pre-filled with shared test credentials. You can use these immediately — no dedicated test account required — to test.

Shared credentials cover Properties and Property endpoints only. Reservations and Export require your dedicated test account credentials. Update the environment variables with your credentials once your test environment is set up.

{% hint style="info" %}
For full certification scenario coverage, see [Testing and Certification](https://developer.siteminder.com/siteminder-apis/channels/introduction/channels-plus/testing-and-certification).
{% endhint %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Integration Requirements

Technical standards, security protocols, and compliance requirements that apply across all Channels Plus API components.

This page defines the technical standards, security protocols, and operational requirements that apply across all Channels Plus API components. These requirements ensure reliable, secure, and efficient connectivity between your booking channel and the SiteMinder platform.

### Compliance Policy

All integration partners must adhere to these requirements. Due to the growing number of partner integrations, SiteMinder can no longer accommodate exceptions.

**Non-Compliance Timeline**:

* Partners have **90 days** to remediate non-compliance issues after notification.
* Failure to comply may result in interface deactivation.
* **Critical issues** affecting production stability may result in **immediate temporary suspension**.

***

### Technical Foundation

Channels Plus is a **REST/JSON API**. All requests are standard HTTPS using JSON payloads.

<table><thead><tr><th width="199.8419189453125">Item</th><th>Detail</th></tr></thead><tbody><tr><td>Protocol</td><td>REST over HTTPS</td></tr><tr><td>Format</td><td>JSON</td></tr><tr><td>Authentication</td><td>Two-header channel-level (<code>x-sm-api-id</code> + <code>x-sm-api-key</code>)</td></tr><tr><td>API Specification</td><td>OpenAPI (YAML available for download)</td></tr></tbody></table>

***

### Security

#### Transport Layer Security

**Minimum Standard**: TLS 1.2 or higher

* All communication must use HTTPS
* Self-signed certificates are not supported
* Ensure your systems comply with PCI DSS requirements when handling credit card data

#### Authentication

Channels Plus uses channel-level authentication. Both headers are required on every request:

<table><thead><tr><th width="200.267333984375">Header</th><th>Description</th></tr></thead><tbody><tr><td><code>x-sm-api-id</code></td><td>Your assigned channel identifier</td></tr><tr><td><code>x-sm-api-key</code></td><td>Your channel secret key</td></tr></tbody></table>

Credentials are generated from the Partner Portal. Missing or invalid credentials return **HTTP 401**.

{% hint style="danger" %}
**Server-to-server use only.** Never expose your `x-sm-api-id` or `x-sm-api-key` in front-end or client-side code, or in logs. Doing so risks credential exposure and rate limit exhaustion.
{% endhint %}

***

### Rate Limiting

Channels Plus enforces a rate limit on a rolling time window per channel. Responses include rate limit headers you should monitor:

<table><thead><tr><th width="245.32379150390625">Response Header</th><th>Description</th></tr></thead><tbody><tr><td><code>ratelimit-policy</code></td><td>Requests allowed per window, e.g. <code>100;w=60</code> means 100 requests per 60 seconds</td></tr><tr><td><code>ratelimit-limit</code></td><td>Total requests allowed in the current window</td></tr><tr><td><code>ratelimit-remaining</code></td><td>Requests remaining in the current window</td></tr><tr><td><code>ratelimit-reset</code></td><td>Seconds until the window resets</td></tr></tbody></table>

**On HTTP 429**: Wait for the window to reset before retrying. Implement exponential backoff — recommended pattern: 1s → 2s → 4s, maximum 3 retries. Do not retry immediately.

***

### Deals

Deals are promotional offers that provide access to better rates from participating properties. Implementing Deals increases the likelihood of bookings and is central to how Channels Plus partners compete effectively.

**Two deal types are available**:

* **Direct Agreements** — a deal between a single property and your channel, with an active date range, discount rate, and commission rate
* **Campaigns** — a deal between your channel and one or more properties, with defined Stay Dates and Book Dates

For full details see [Deals](/channels-plus-api/additional-resources/commercial/deals).

***

### Booking Flow Requirements

#### Pending Reservation Expiry

Pending reservations expire approximately **10 minutes** after creation.

Your confirmation flow must complete within the 10-minute lock window. Expired reservations release held inventory back to the platform immediately.

#### Card Type Validation

Before confirming a reservation, check the property's `acceptedCardTypes` to verify the guest's card is supported. Using an unsupported card type returns a **400** error.

#### Cancellation Policy

Before presenting cancellation options to guests, always verify the `policyType` and `freeCancellationUntilDays` on the rate:

<table><thead><tr><th width="199.81597900390625">Policy Type</th><th>Description</th></tr></thead><tbody><tr><td><code>free-cancellation</code></td><td>Can be cancelled up to N days before check-in</td></tr><tr><td><code>non-refundable</code></td><td>Cannot be cancelled; <code>freeCancellationUntilDays</code> is null</td></tr></tbody></table>

{% hint style="info" %}
Only reservations with `policyType: "free-cancellation"` can be cancelled via the API, and only within the free cancellation period.
{% endhint %}

#### Commission

All pricing includes a commission breakdown. Your integration must correctly account for commission in all pricing and payment flows:

```json
{
  "totalCommissionPercentage": 18.0,
  "siteminderCommissionPercentage": 3.0,
  "channelCommissionPercentage": 15.0
}
```

`totalCommissionPercentage` = `siteminderCommissionPercentage` + `channelCommissionPercentage`

For full details see [Invoicing: Gross vs. Net](/channels-plus-api/additional-resources/commercial/invoicing-gross-vs-net).

***

### Data Constraints

These constraints are enforced by the API and must be respected in your integration logic.

| Constraint                           | Value        |
| ------------------------------------ | ------------ |
| Date format                          | `yyyy-MM-dd` |
| Max advance booking                  | 500 days     |
| Length of stay                       | 1–30 nights  |
| Max rooms per reservation            | 10           |
| Max date range (`Reservations List`) | 31 days      |
| Max lookback for `fromDate`          | 365 days     |

***

### Pagination

All list endpoints return paginated responses. Your integration must iterate correctly through pages and must not assume all results are returned in a single response.

* Use `page` and `perPage` query parameters to iterate
* `perPage` must be a **multiple of 10**
* Continue iterating until you have retrieved all pages

**`perPage` limits by endpoint**:

| Endpoint          | Max perPage |
| ----------------- | ----------- |
| Properties search | 100         |
| Reservations List | 200         |
| Export            | 500         |

***

### Data Freshness

Availability and pricing change in real time as inventory is booked and configuration is updated. Do not cache availability or pricing responses for extended periods — stale data will cause booking errors.

For property content (descriptions, photos, amenities, room types), refresh your local catalog periodically to capture rate plan changes and updated content.&#x20;

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Testing and Certification

Test your Channels Plus integration and confirm readiness before going live with SiteMinder.

Use this guide to verify that all required integration capabilities are working correctly. Work through the scenarios independently, and when you're confident in your results, notify the Partner Integrations team. We'll review your readiness, prepare your account, and confirm when you can proceed to certification.

## Instructions

This guide provides a series of scenarios to test all required integration capabilities for this API. Some capabilities may be optional — if a scenario does not apply to your integration, skip it and proceed to the next one. Work through each scenario using the resources provided in the Initial Setup section, and use the results to verify your integration is working correctly before requesting certification.

Once all scenarios pass, notify the Partner Integrations team. We will review your results, and if everything looks good, confirm when you can proceed to the formal certification process.

## Initial Setup

Before working through the test scenarios, make sure the following are in place:

1. **Postman collection** — Download and import the [Channels Plus Postman](https://www.postman.com/siteminder-apis/channels-plus/overview) collection.
2. **Partner Portal access** — You will need access to the Partner Portal to create [Deals](/channels-plus-api/additional-resources/commercial/deals).
3. **Deal code** — Create a deal in the Partner Portal and have it approved before running scenarios.

{% hint style="info" %}
Your `API ID` and `API Key` for testing are available in the Partner Portal. **Make sure to replace all variables in the Postman collection before running the scenarios.**
{% endhint %}

## Test Scenarios

This outlines the use cases that a partner must successfully complete in order to achieve certification for the Channels Plus Channel API.

### Get Properties

The purpose of this endpoint is to allow the partner to retrieve a list of properties on Channels Plus within a certain lat, long & radius boundary that matches their search criteria.

{% hint style="info" %}
The following are mandatory query parameters for the "Get Properties" request:

* latitude
* longitude
* checkin
* checkout
* number of rooms and occupancy details. There are two options. You can only use one of the following options in the request, not both:
  * totalRooms, totalAdults, and totalChildren
  * rooms (see sample in scenario 3)
    {% endhint %}

<details>

<summary><strong>1. Mandatory fields with 1-night room stay for total occupancy</strong><br><br>Call the get properties endpoint with mandatory elements only to retrieve a list of properties within the default radius of a lat/long boundary for a stay of more than 1 night. For this scenario use just <mark style="background-color:orange;">the total adults and children</mark> for the entire reservation.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties?latitude=-33.9&longitude=151.18&checkin=2025-04-09&checkout=2025-04-11&totalRooms=1&totalAdults=2&totalChildren=1
```

**View Sample Request and Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-f6cf7193-03ba-4348-9b85-fcd1bf417e7a>

</details>

<details>

<summary><strong>2. Mandatory fields with more than 1 night with pagination</strong><br><br>Call the get properties endpoint with mandatory elements only to retrieve a list of properties within the default radius of a lat/long boundary for a stay of more than 1 night. For this scenario use just <mark style="background-color:orange;">the <strong>total adults and children</strong></mark> for the entire reservation. <mark style="background-color:orange;">Request for the second page of this response</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties?latitude=-33.9&longitude=151.18&checkin=2025-04-12&checkout=2025-04-14&totalRooms=1&totalAdults=2&totalChildren=1&perPage=10&page=1
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-de8b2361-8612-431e-935c-1d4092577e2f>

</details>

<details>

<summary><strong>3. Mandatory fields with 2 room stay</strong><br><br>Call the get properties endpoint with mandatory elements only to retrieve a list of properties within the default radius of a lat/long boundary for a stay of more than 1 night. For this scenario <mark style="background-color:orange;">provide a breakdown of adult &#x26; child occupancy for a 2 room stay</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties?latitude=-33.9&longitude=151.18&checkin=2025-04-12&checkout=2025-04-14&rooms[0][adults]=2&rooms[0][children]=1&rooms[1][adults]=2&rooms[1][children]=1
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-ce31d89e-80cc-4eae-942d-408332c4693b>

</details>

<details>

<summary><strong>4. Mandatory fields within a set radius</strong><br><br>Call the get properties endpoint with mandatory elements only to retrieve a list of properties <mark style="background-color:orange;">within a specified radius</mark> of a lat/long boundary for a stay of more than 1 night. For this scenario use just the <mark style="background-color:orange;">total adults and children</mark> for the entire reservation.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties?latitude=-33.9&longitude=151.18&checkin=2025-04-12&checkout=2025-04-14&totalRooms=1&totalAdults=2&totalChildren=1&radius=50
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-e4790454-2236-4a95-b5f6-78510505218e>

</details>

<details>

<summary><strong>5. Mandatory fields and specific deals only</strong><br><br>Call the get properties endpoint with mandatory elements only to retrieve a list of properties within the default radius of a lat/long boundary for a stay of more than 1 night. For this scenario use just <mark style="background-color:orange;">the total adults and children</mark> for the entire reservation. Additionally <mark style="background-color:orange;">specify a deal code and set the deal only flag</mark> to receive rates that are part of a deal only. Skip if you will not use the <a href="https://developer.siteminder.com/channels-plus-api/additional-resources/commercial/deals">Deals</a> functionality.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties?latitude=-33.9&longitude=151.18&checkin=2025-04-12&checkout=2025-04-14&totalRooms=1&totalAdults=2&totalChildren=1&dealCodes=bd06c1c5-7efb-47f8-b269-454f48b0fa0e&dealOnly=true
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-e1eebb58-3979-41e8-b8db-f07661a684a2>

</details>

<details>

<summary><strong>6. Invalid latitude and longitude</strong><br><br>Call the get properties endpoint with <mark style="background-color:orange;">an invalid lat/long</mark> and receive an error.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties?latitude=33.9test&longitude=151.18test&checkin=2025-04-12&checkout=2025-04-14&totalRooms=1&totalAdults=2&totalChildren=1
```

**Error:**

```json
{"errors":[{"code":"InvalidInputError","message":"should be number","meta":{"type":"number","params":{"type":"number"},"keyword":"type","dataPath":".query.latitude","schemaPath":"#/properties/query/properties/latitude/type"}},{"code":"InvalidInputError","message":"should be number","meta":{"type":"number","params":{"type":"number"},"keyword":"type","dataPath":".query.longitude","schemaPath":"#/properties/query/properties/longitude/type"}}]}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-c93508c4-2fc5-463b-81e1-3033d4707ef7>

</details>

***

### Get Property <a href="#get-property" id="get-property"></a>

The purpose of this endpoint is to allow the partner to retrieve detailed information and room rates on Channels Plus for a specific property.

{% hint style="info" %}
Mandatory Query Parameters for the **Get Property** Request:

* uuid: Unique identifier for the property
* checkin
* checkout
* number of rooms and occupancy details
  {% endhint %}

<details>

<summary><strong>1. Mandatory fields with total occupancy set</strong><br><br>Call the get property endpoint with mandatory elements only to retrieve a list of room rates at the property for a stay of more than 1 night. For this scenario, use the entire reservation's <mark style="background-color:orange;">total number of adults and children</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/160efac8-7e63-43b2-a1f3-6dbe2cdcfd8b?checkin=2025-01-11&checkout=2025-01-13&totalRooms=1&totalAdults=2&totalChildren=1
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-9cba71de-7fa6-4a33-bacb-33b047fdb260>

</details>

<details>

<summary><strong>2. Mandatory fields with room occupancy set</strong><br><br>Call the get property endpoint with mandatory elements only to retrieve a list of room rates at the property for a stay of more than 1 night. For this scenario, <mark style="background-color:orange;">provide a breakdown of adult &#x26; child occupancy for a 2-room stay</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/160efac8-7e63-43b2-a1f3-6dbe2cdcfd8b?checkin=2025-03-04&checkout=2025-03-06&rooms[0][adults]=2&rooms[0][children]=0&rooms[1][adults]=2&rooms[1][children]=1
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-4248647d-4ad9-464a-94d5-afdef4be48a0>

</details>

<details>

<summary><strong>3. Mandatory fields with deal only</strong><br><br>Call the get property endpoint with mandatory elements only to retrieve a list of room rates at the property for a stay of more than 1 night. For this scenario, use the entire reservation's <mark style="background-color:orange;">total number of adults and children</mark>. Additionally, <mark style="background-color:orange;">specify a deal code</mark> to receive rates that are part of the deal only. Skip if you will not use the <a href="https://developer.siteminder.com/channels-plus-api/additional-resources/commercial/deals">Deals</a> functionality.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/160efac8-7e63-43b2-a1f3-6dbe2cdcfd8b?checkin=2025-04-19&checkout=2025-04-21&totalRooms=1&totalAdults=2&totalChildren=1&dealCode=90508fbd-2b33-44dd-9eb0-948ec4ea086e
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-e2697576-ea7f-4e9c-ad88-bf7f6c7df280>

</details>

<details>

<summary><strong>4. Invalid Property</strong><br><br><strong>Call the get property endpoint with an invalid property uuid and receive an error.</strong></summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/invalid?checkin=2025-04-19&checkout=2025-04-21&totalRooms=1&totalAdults=2&totalChildren=1
```

**Error:**

```json
{"errors":[{"code":"PropertyNotFoundError","message":"property with spid=invalid not found"}]}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-89044937-3e56-444a-96a0-b66365bc6527>

</details>

***

### Lock reservation

The purpose of this endpoint is to allow the partner to **temporarily lock a reservation for a 15-minute window**, so the inventory is not booked by another Channels Plus Channel.

<details>

<summary><strong>1. Valid room rate</strong><br><br>Call the lock a reservation endpoint with a <mark style="background-color:orange;">valid array of room rate bookings</mark>. Do not set the deal code and deal flag.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/160efac8-7e63-43b2-a1f3-6dbe2cdcfd8b/reservations
```

**Sample Body:**

```json
{
  "checkin": "2025-04-19",
  "checkout": "2025-04-21",
  "rooms": [
    {
      "roomRateUuid": "2298f8f6-fb91-4095-b225-9290b6d3c231",
      "adults": 2,
      "children": 1
    }
  ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-3e8792e5-5844-413e-ab3e-077ddb862c91>

</details>

<details>

<summary><strong>2. Valid room rate with deal code</strong><br><br>Call the lock a reservation endpoint with a valid array of room rate bookings. <mark style="background-color:orange;">Set the deal code and deal flag, if you choose to use the</mark> <a href="https://developer.siteminder.com/channels-plus-api/additional-resources/commercial/deals"><mark style="background-color:orange;">Deals</mark></a> <mark style="background-color:orange;">funtionality.</mark></summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/160efac8-7e63-43b2-a1f3-6dbe2cdcfd8b/reservations
```

**Sample Body:**

```json
{
  "checkin": "2025-04-19",
  "checkout": "2025-04-21",
  "dealCode": "90508fbd-2b33-44dd-9eb0-948ec4ea086e",
  "rooms": [
    {
      "roomRateUuid": "2298f8f6-fb91-4095-b225-9290b6d3c231",
      "adults": 2,
      "children": 1,
      "applyDeal":true
    }
  ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-1d38075e-9e9f-4888-81c6-bd14924e208f>

</details>

<details>

<summary><strong>3. Invalid room rate</strong><br><br>Call the lock a reservation endpoint with an <mark style="background-color:orange;">invalid room rate UUID and receive an error</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/160efac8-7e63-43b2-a1f3-6dbe2cdcfd8b/reservations
```

**Sample Body:**

```
{
  "checkin": "2025-04-19",
  "checkout": "2025-04-21",
  "rooms": [
    {
      "roomRateUuid": "invalid",
      "adults": 2,
      "children": 1
    }
  ]
}
```

**Error:**

```json
{"errors":[{"code":"RoomRateNotFoundError","message":"Some room rates in roomRateUuids=[invalid] not found"}]}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-73f35c66-5b15-4fa0-98af-a7b3de2b29e3>

</details>

<details>

<summary><strong>4. Valid room rate with netInvoicing</strong><br><sub><em>Note: This is available to partners with a Net Invoicing agreement only, <mark style="color:red;">not available to partners operating under a Gross Invoicing model</mark>.</em></sub><br><br>Call the lock a reservation endpoint with a <mark style="background-color:orange;">valid array of room rate bookings</mark>. Set the <mark style="background-color:orange;">netInvoicing to true</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/properties/160efac8-7e63-43b2-a1f3-6dbe2cdcfd8b/reservations
```

**Sample Body:**

```json
{
  "checkin": "2025-04-19",
  "checkout": "2025-04-21",
  "netInvoicing": true,
  "rooms": [
    {
      "roomRateUuid": "2298f8f6-fb91-4095-b225-9290b6d3c231",
      "adults": 2,
      "children": 1
    }
  ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-727a67c0-1023-49bb-a628-bee9485b59c4>

</details>

***

### Confirm reservation

The purpose of this endpoint is to allow the partner to confirm a temporarily locked reservation so the inventory is not booked by another non-Channels Plus Channel.

<details>

<summary><strong>1. Confirm reservation using credit card information</strong><br><br>Call the confirm reservation endpoint <mark style="background-color:orange;">with a credit card payment type</mark> with valid card type, card metadata and guest information.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/48609eca-3/confirmation
```

**Sample Body:**

```json
{
    "paymentMethod":"CreditCard",
    "cardNumber": 4444333322221111,
    "cardholderName": "FirstName LastName",
    "cardExpiry": "04/2027",
    "cardType": "VI",
    "cardCvv": "123",
    "guestTitle": "Mr",
    "guestFirstName": "FirstName",
    "guestLastName": "LastName",
    "guestEmail": "test@example.com",
    "guestPhoneNumber": "708-406-5153",
    "guestAddress": "612 Rusty Glens",
    "guestCity": "Fayetteville",
    "guestState": "Ava Orchard",
    "guestPostcode": "1234",
    "guestCountry": "Norfolk Island",
    "guestRemarks": "This is for testing purposes",
    "rooms": [
        {
        "roomUuid": "96b1f3bf-eb08-4f85-b059-09e1f3259bab",
        "guestTitle": "Mr",
        "guestFirstName": "FirstName",
        "guestLastName": "LastName",
        "guestRemarks": "This is a test"
        }
    ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-7f55ffa5-c880-44b0-af96-75cbb968d18a>

</details>

<details>

<summary><strong>2. Confirm reservation with a Virtual Credit Card</strong><br><br>Call the confirm reservation endpoint <mark style="background-color:orange;">with a virtual credit card</mark> payment type with valid card type, card metadata and guest information.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/55bfe5bd-3/confirmation
```

**Sample Body:**

```json
 {
    "paymentMethod":"VirtualCreditCard",
    "vccActivationDateTime": "2024-04-25T13:58:56.450Z",
    "vccDeactivationDateTime": "2025-05-06T13:58:56.450Z",
    "vccCurrency": "AUD",
    "vccBalance": 200.2,
    "cardNumber": 4444333322221111,
    "cardholderName": "FirstName LastName",
    "cardExpiry": "07/2025",
    "cardType": "VI",
    "cardCvv": "123",
    "guestTitle": "Mr",
    "guestFirstName": "FirstName",
    "guestLastName": "LastName",
    "guestEmail": "Test@Test.com",
    "guestPhoneNumber": "<string>",
    "guestAddress": "1 Sydney St",
    "guestCity": "Sydney",
    "guestState": "NSW",
    "guestPostcode": "2000",
    "guestCountry": "Australia",
    "guestRemarks": "Test remarks",
    "rooms": [
        {
        "roomUuid": "f88d7264-1c12-4aaa-9347-a6cf676a8ba7",
        "guestTitle": "Mr",
        "guestFirstName": "FirstName",
        "guestLastName": "LastName",
        "guestRemarks": "Test remarks"
        }
    ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-4a9bcdb0-18cc-4d36-b6e7-1b83167ecbed>

</details>

<details>

<summary><strong>3. Expired Reservation</strong><br><br>Call the confirm reservation endpoint <mark style="background-color:orange;">with a valid reservation UUID that has now timed out to receive error.</mark></summary>

*Note: The timeout window is 15 minutes*

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/6c250a6a-3/confirmation
```

**Sample Body:**

```json
{
    "paymentMethod":"VirtualCreditCard",
    "vccActivationDateTime": "2024-06-29T19:09:56.450Z",
    "vccDeactivationDateTime": "2025-05-10T19:09:56.450Z",
    "vccCurrency": "AUD",
    "vccBalance": 100.1,
    "cardNumber": 4444333322221111,
    "cardholderName": "Test Test",
    "cardExpiry": "07/2025",
    "cardType": "VI",
    "cardCvv": "123",
    "guestTitle": "Mr",
    "guestFirstName": "Test",
    "guestLastName": "Test",
    "guestEmail": "Test@Test.com",
    "guestPhoneNumber": "<string>",
    "guestAddress": "1 Sydney St",
    "guestCity": "Sydney",
    "guestState": "NSW",
    "guestPostcode": "2000",
    "guestCountry": "Australia",
    "guestRemarks": "Test remarks",
    "rooms": [
        {
        "roomUuid": "365568b1-b7e1-4195-9d6d-9db6bffcea44",
        "guestTitle": "Mr",
        "guestFirstName": "Test",
        "guestLastName": "Test",
        "guestRemarks": "Test remarks"
        }
    ]
}
```

**Error:**

```json
{
    "errors": [
        {
            "code": "ReservationNotFoundError",
            "message": "pending reservation not found"
        }
    ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-31a8940c-74b0-4549-a7e7-185ae0700f61>

</details>

<details>

<summary><strong>4. Non-existing Reservation</strong><br><br>Call the confirm reservation endpoint with <mark style="background-color:orange;">an invalid reservation UUID</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/invalidbookingRef/confirmation
```

**Sample Body:**

```json
{
    "paymentMethod":"VirtualCreditCard",
    "vccActivationDateTime": "2024-06-29T19:09:56.450Z",
    "vccDeactivationDateTime": "2025-05-10T19:09:56.450Z",
    "vccCurrency": "AUD",
    "vccBalance": 100.1,
    "cardNumber": 4444333322221111,
    "cardholderName": "Test Test",
    "cardExpiry": "07/2025",
    "cardType": "VI",
    "cardCvv": "123",
    "guestTitle": "Mr",
    "guestFirstName": "Test",
    "guestLastName": "Test",
    "guestEmail": "Test@Test.com",
    "guestPhoneNumber": "<string>",
    "guestAddress": "1 Sydney St",
    "guestCity": "Sydney",
    "guestState": "NSW",
    "guestPostcode": "2000",
    "guestCountry": "Australia",
    "guestRemarks": "Test remarks",
    "rooms": [
        {
        "roomUuid": "365568b1-b7e1-4195-9d6d-9db6bffcea44",
        "guestTitle": "Mr",
        "guestFirstName": "Test",
        "guestLastName": "Test",
        "guestRemarks": "Test remarks"
        }
    ]
}
```

**Error:**

```json
{
    "errors": [
        {
            "code": "ReservationNotFoundError",
            "message": "pending reservation not found"
        }
    ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-e11555f2-23db-4e61-8fce-44b5682cee7b>

</details>

***

### Modify reservation

The purpose of this endpoint is to allow the partner to modify the guest details on a confirmed reservation.

<details>

<summary><strong>1. Valid modify guest details</strong><br><br>Call the modify reservation endpoint with a valid reservation UUID and valid guest details.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/48609eca-3
```

**Sample Body:**

```json
{
  "guestTitle": "Ms",
  "guestFirstName": "new_FirstName",
  "guestLastName": "new_LastName",
  "guestEmail": "new_test@example.com",
  "guestPhoneNumber": "337-861-3753",
  "guestAddress": "27314 Leann Tunnel",
  "guestCity": "new_city",
  "guestState": "new_state",
  "guestPostcode": "new_Postcode",
  "guestCountry": "new_country",
  "guestRemarks": "new_guestRemarks",
  "rooms": [
    {
      "roomUuid": "4b0e1df9-f49d-4655-92e3-eac619299c3d",
      "guestTitle": "Ms",
      "guestFirstName": "new_FirstName",
      "guestLastName": "new_LastName",
      "guestRemarks": "new_guestRemarks"
    }
  ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-16b3b42b-f5e3-4503-9305-36767c29dc38>

</details>

<details>

<summary><strong>2. Modify guest details whilst guest checked-in</strong><br><br>Call the modify reservation endpoint with a valid reservation UUID for a reservation that <mark style="background-color:orange;">has already been checked in</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/48609eca-3
```

**Sample Body:**

```json
{
  "guestTitle": "Ms",
  "guestFirstName": "new_FirstName",
  "guestLastName": "new_LastName",
  "guestEmail": "new_test@example.com",
  "guestPhoneNumber": "337-861-3753",
  "guestAddress": "27314 Leann Tunnel",
  "guestCity": "new_city",
  "guestState": "new_state",
  "guestPostcode": "new_Postcode",
  "guestCountry": "new_country",
  "guestRemarks": "new_guestRemarks",
  "rooms": [
    {
      "roomUuid": "4b0e1df9-f49d-4655-92e3-eac619299c3d",
      "guestTitle": "Ms",
      "guestFirstName": "new_FirstName",
      "guestLastName": "new_LastName",
      "guestRemarks": "new_guestRemarks"
    }
  ]
}
```

**Error:**

```json
{
    "errors": [
        {
            "code": "CannotModifyAfterCheckInError",
            "message": "cannot modify on or after the check-in date",
            "meta": {
                "traceToken": "5012c8c8-0c7d-480f-9604-c30944ea548f"
            }
        }
    ]
}
```

</details>

<details>

<summary><strong>3. Non-existing reservation</strong><br><br>Call the modify reservation endpoint with <mark style="background-color:orange;">an invalid reservation UUID</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/d05492f1-x
```

**Sample Body:**

```json
{
  "guestTitle": "Ms",
  "guestFirstName": "new_FirstName",
  "guestLastName": "new_LastName",
  "guestEmail": "new_test@example.com",
  "guestPhoneNumber": "337-861-3753",
  "guestAddress": "27314 Leann Tunnel",
  "guestCity": "new_city",
  "guestState": "new_state",
  "guestPostcode": "new_Postcode",
  "guestCountry": "new_country",
  "guestRemarks": "new_guestRemarks",
  "rooms": [
    {
      "roomUuid": "4b0e1df9-f49d-4655-92e3-eac619299c3d",
      "guestTitle": "Ms",
      "guestFirstName": "new_FirstName",
      "guestLastName": "new_LastName",
      "guestRemarks": "new_guestRemarks"
    }
  ]
}
```

**Error:**

```json
{
    "errors": [
        {
            "code": "ReservationNotFoundError",
            "message": "reservation not found"
        }
    ]
}
```

</details>

***

### Cancel reservation

The purpose of this endpoint is to allow the partner to cancel a confirmed reservation within the cancellable period.

<details>

<summary><strong>1. Cancelled Reservation</strong><br><br>Call the cancel reservation endpoint with a valid reservation UUID</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/55bfe5bd-3/cancellation
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-d576cc36-57b4-4f3c-973d-ed7a534f927c>

</details>

<details>

<summary><strong>2. Reservation does not exist</strong><br><br>Call the cancel a reservation endpoint with an invalid reservation UUID.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/55bfe5bd-3/cancellation
```

**Error:**

```json
{
    "errors": [
        {
            "code": "ReservationNotFoundError",
            "message": "reservation not found"
        }
    ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-9575312c-a7e1-40ff-ac7f-884f966e6979>

</details>

<details>

<summary><strong>3. Cancelling outside the cancellation period</strong><br><br>Call the cancel a reservation endpoint with a valid reservation UUID for a reservation that is <mark style="background-color:orange;">no longer in a free cancellation period</mark>.</summary>

**Sample Request:**

```
https://tpi-channel-api.preprod.smchannelsplus.com/reservations/328e88f2-3/cancellation
```

**Error:**

```json
{
    "errors": [
        {
            "code": "OutsideCancellationPeriodError",
            "message": "cannot cancel outside of cancellation period",
            "meta": {
                "traceToken": "aec1c423-cab9-47ed-9939-636e6e759c8d"
            }
        }
    ]
}
```

**View Sample Request & Response:**

<https://www.postman.com/siteminder-apis/channels-plus/example/31209038-fef467df-37c3-4768-a60b-474f9544254b>

</details>

## Final Steps

Once all scenarios have passed, notify the Partner Integrations team. We will review your results and confirm when you can proceed to certification. If any issues are identified during the review, we will reach out to you directly to resolve them before moving forward.

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# API Overview

Use this page to understand what each Channels Plus API component does and what data it handles.

There are two ways to discover properties on Channels Plus before making a reservation:

* **Channel API** — search for live availability in real time using the Properties and Property endpoints.
* **Export API** — pre-load a local catalog of property content and room rates, then use the Channel API to confirm live pricing before booking.

## Reservation Journey

### **Channel API**

Use the Channel API to search for live availability and current pricing in real time. This is the standard reservation flow.

{% stepper %}
{% step %}

#### Get properties

Call the get properties endpoint to retrieve the available inventory on Channels Plus that matches your booking guest's criteria.
{% endstep %}

{% step %}

#### Get property

Call the get property endpoint to retrieve the room rates for a specific property that your booking guest is interested in.
{% endstep %}

{% step %}

#### Lock reservation

Call the lock reservation endpoint once your booking guest has reviewed the room rates and would like to reserve the selected room rate.
{% endstep %}

{% step %}

#### Confirm reservation

Call the confirm reservation endpoint after your booking guest has provided all necessary details (e.g., payment information) to complete the booking.
{% endstep %}
{% endstepper %}

### Export API

The Export API is an alternative to the Channels Plus Channel API for property discovery. It does **not** replace the Channel API for the purposes of making a reservation — both APIs are required in the reservation flow.

{% stepper %}
{% step %}

#### Export Properties

Call Export Properties to retrieve the list of properties available to you on Channels Plus.
{% endstep %}

{% step %}

#### Export Property

Call Export Property for each property to retrieve static content and the list of available room rates.
{% endstep %}

{% step %}

#### Get Property

Call Get Property on the Channel API to retrieve live availability and current pricing for room rates matching your guest's stay criteria.
{% endstep %}

{% step %}

#### Lock a Reservation

Call the lock reservation endpoint once your booking guest has reviewed the room rates and would like to reserve the selected room rate.
{% endstep %}

{% step %}

#### Confirm a Reservation

Call the confirm reservation endpoint after your booking guest has provided all necessary details (e.g., payment information) to complete the booking.
{% endstep %}
{% endstepper %}

***

## Endpoints

### **Channel API**

{% columns %}
{% column %}

#### <sub>Properties</sub>

`REST/JSON`

Returns an array of shoppable properties on Channels Plus that match the specified search criteria. This endpoint also provides property content, along with the best available deal and non-deal room rate for each property.

* [Properties](/channels-plus-api/reference/property)
  {% endcolumn %}

{% column %}

#### <sub>Property</sub>

`REST/JSON`

Returns content and available room rates for a specific property that meets the requested occupancy combination.

* [Property](/channels-plus-api/reference/property)
  {% endcolumn %}
  {% endcolumns %}

***

{% columns %}
{% column %}

#### <sub>Lock Reservation</sub>

`REST/JSON`

Temporarily locks one or more room rates at a specific property for a limited period.

* [Lock Reservation](/channels-plus-api/reference/lock-reservation)
  {% endcolumn %}

{% column %}

#### <sub>Confirm Reservation</sub>

`REST/JSON`

Confirms a locked reservation that is still within the lock period.

* [Confirm Reservation](/channels-plus-api/reference/confirm-reservation)
  {% endcolumn %}
  {% endcolumns %}

***

{% columns %}
{% column %}

#### <sub>Modify Reservation</sub>

`REST/JSON`&#x20;

Updates guest details and remarks for an existing reservation. Changes that affect pricing cannot be modified. If pricing-related details need to be updated, the reservation must be canceled and rebooked following the same reservation flow.

* [Modify Reservation](/channels-plus-api/reference/modify-reservation)
  {% endcolumn %}

{% column %}

#### <sub>Cancel Reservation</sub>

`REST/JSON`&#x20;

Cancel a reservation that is still within the cancellation period.

* [Cancel Reservation](/channels-plus-api/reference/cancel-reservation)
  {% endcolumn %}
  {% endcolumns %}

***

{% columns %}
{% column %}

#### <sub>Reservations List</sub>

`REST/JSON`

Retrieves a list of reservations based on the specified dateType (bookedOn, checkIn, or checkOut) and a date range (fromDate to toDate) of no more than 31 days.

* [Reservations List](/channels-plus-api/reference/reservations-list)
  {% endcolumn %}

{% column %}

#### <sub>Reservation Detail</sub>

`REST/JSON`

Retrieves detailed information for a specific reservation created via the API.

* [Reservation Detail](#reservation-detail)
  {% endcolumn %}
  {% endcolumns %}

### **Export API**

{% columns %}
{% column %}

#### <sub>Properties</sub>

`REST/JSON`

Returns a paginated list of property IDs on Channels Plus that you have access to.

* [Export Properties](/channels-plus-api/reference/export/properties)
  {% endcolumn %}

{% column %}

#### <sub>Property</sub>

`REST/JSON`

Returns all static content and room rates for a specific property.

* [Export Property](/channels-plus-api/reference/export/property)
  {% endcolumn %}
  {% endcolumns %}

***

## **Flow Examples**

### **Make a Reservation**

<div data-with-frame="true"><figure><img src="/files/9MrUOF3cHBpHPEmMVndA" alt=""><figcaption></figcaption></figure></div>

### **Modify Guest Details**

<div data-with-frame="true"><figure><img src="/files/8ZvAlCzZU67orXSaJfvZ" alt=""><figcaption></figcaption></figure></div>

### **Cancel a Reservation**

<div data-with-frame="true"><figure><img src="/files/2WBOK0yjNXAYixuopKyA" alt=""><figcaption></figcaption></figure></div>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Overview

The agentic integration path for Channels Plus.

## What is Channels Plus MCP Server?

The SiteMinder Channels Plus MCP Server provides channel partners with AI-assisted access to the SiteMinder platform via the **Model Context Protocol (MCP)**. It enables programmatic property discovery, reservation management, and property content export through a single HTTP endpoint.

**Protocol:** MCP (Model Context Protocol) over stateless HTTP\
**Endpoint:** `POST /mcp`\
**Format:** JSON-RPC 2.0\
**MCP Version:** 2025-06-18

***

## Setup

### Authentication

Every request to the MCP server must include two HTTP headers:

| Header         | Description                      |
| -------------- | -------------------------------- |
| `x-sm-api-id`  | Your assigned channel identifier |
| `x-sm-api-key` | Your channel secret key          |

Missing or invalid credentials return HTTP `401 Unauthorized`:

```json
{
  "errors": [
    {
      "code": "credentials_required",
      "message": "missing x-sm-api-id or x-sm-api-key"
    }
  ]
}
```

Credentials are issued during partner onboarding. Contact your SiteMinder integration manager if you need to rotate keys.

***

### Transport & Protocol

#### Endpoint

All MCP interactions are sent as HTTP POST requests to a single endpoint:

```
POST https://<mcp-server-host>/mcp
```

#### Required Headers

| Header         | Value                                 |
| -------------- | ------------------------------------- |
| `Content-Type` | `application/json`                    |
| `Accept`       | `application/json, text/event-stream` |
| `x-sm-api-id`  | Your channel identifier               |
| `x-sm-api-key` | Your channel secret key               |

#### Request Format

Requests use the JSON-RPC 2.0 envelope:

{% code expandable="true" %}

```json
{
  "jsonrpc": "2.0",
  "id": "req-001",
  "method": "tools/call",
  "params": {
    "name": "<tool_name>",
    "arguments": {
      "<param1>": "<value1>",
      "<param2>": "<value2>"
    }
  }
}
```

{% endcode %}

> **Note:** Tool parameters go inside `params.arguments`, not directly in `params`.

#### Response Format

**Success:**

{% code expandable="true" %}

```json
{
  "jsonrpc": "2.0",
  "id": "req-001",
  "result": {
    "content": [
      {
        "type": "text",
        "text": "<JSON-serialized result>"
      }
    ]
  }
}
```

{% endcode %}

**Tool Error** (see Error Handling for full details):

#### Session Model

The server is **stateless**. Each request is independent — there are no sessions to establish or maintain. No session initialization, handshake, or keep-alive is required.

#### Request Tracing

You may include an `x-sm-trace-token` header for correlating requests with your internal systems. If omitted, a trace token is generated automatically. Include this token when contacting SiteMinder support to help diagnose issues.

***

## Using the API

### Available Tools

#### Property Discovery

| Tool              | Description                                                         |
| ----------------- | ------------------------------------------------------------------- |
| `list_properties` | Search for properties by location, dates, and filters               |
| `show_property`   | Get detailed property info including room types, rates, and pricing |

#### Reservation Management

| Tool                         | Description                                                     |
| ---------------------------- | --------------------------------------------------------------- |
| `create_pending_reservation` | Create a temporary hold on rooms and rates                      |
| `confirm_reservation`        | Finalize a pending reservation with guest details and payment   |
| `show_reservation`           | View details of a confirmed or cancelled reservation            |
| `list_reservations`          | Query reservations by date range                                |
| `modify_reservation`         | Update guest information on an existing reservation             |
| `cancel_reservation`         | Cancel a confirmed reservation (subject to cancellation policy) |

#### Property Content Export

| Tool                | Description                                                                   |
| ------------------- | ----------------------------------------------------------------------------- |
| `export_properties` | List all shoppable properties for indexing                                    |
| `export_property`   | Get full property content (photos, amenities, room types, rates, taxes, fees) |

***

### Booking Workflow

The standard booking flow follows four steps:

```
list_properties  →  show_property  →  create_pending_reservation  →  confirm_reservation
    (search)         (details)           (hold rooms)                  (finalize)
```

#### Step 1: Search Properties — `list_properties`

Search for available properties near a location.

**Required parameters:**

| Parameter      | Type    | Description                           |
| -------------- | ------- | ------------------------------------- |
| `latitude`     | decimal | Center latitude (-90 to 90)           |
| `longitude`    | decimal | Center longitude (-180 to 180)        |
| `checkInDate`  | string  | Arrival date in `yyyy-MM-dd` format   |
| `checkOutDate` | string  | Departure date in `yyyy-MM-dd` format |

**Optional parameters:**

| Parameter               | Type    | Default    | Description                                           |
| ----------------------- | ------- | ---------- | ----------------------------------------------------- |
| `radiusKm`              | decimal | 15         | Search radius in km (15-100)                          |
| `totalAdults`           | int     | —          | Total adults across all rooms                         |
| `totalChildren`         | int     | —          | Total children across all rooms                       |
| `totalRooms`            | int     | —          | Number of rooms needed (1-10)                         |
| `page`                  | int     | 1          | Page number                                           |
| `perPage`               | int     | 20         | Results per page (max 100, multiple of 10)            |
| `sortBy`                | string  | `distance` | Sort by `distance` or `name`                          |
| `sortDirection`         | string  | `asc`      | `asc` or `desc`                                       |
| `minStarRating`         | decimal | —          | Minimum star rating (1, 1.5, 2, ... 6)                |
| `maxStarRating`         | decimal | —          | Maximum star rating                                   |
| `propertyType`          | string  | —          | e.g., `Hotel`, `Resort`, `Apartment` (case-sensitive) |
| `swimmingPoolAvailable` | boolean | —          | Filter for swimming pool                              |
| `breakfastIncluded`     | boolean | —          | Filter for breakfast rates                            |
| `freeCancellation`      | boolean | —          | Filter for free cancellation rates                    |
| `language`              | string  | —          | Preferred content language                            |
| `excludeSelfRated`      | boolean | —          | Exclude self-rated properties                         |

> **Occupancy modes:** Use either `totalAdults`/`totalChildren`/`totalRooms` (aggregate) **or** per-room occupancy via the `rooms` parameter in `create_pending_reservation`. These modes are mutually exclusive.

**Response:** Returns an array of properties. Each property includes:

* Property details (name, address, location, star rating, amenities, photos)
* Commission breakdown (`totalCommissionPercentage`, `siteminderCommissionPercentage`, `channelCommissionPercentage`)
* One or more room options with `roomRateUuid`, pricing, and cancellation policy
* `acceptedCardTypes` for payment (needed at confirmation step)

#### Step 2: View Property Details — `show_property`

Get full details for a specific property, including all room types and rate plans.

**Required parameters:**

| Parameter      | Type   | Description                               |
| -------------- | ------ | ----------------------------------------- |
| `uuid`         | string | Property identifier (from search results) |
| `checkInDate`  | string | Arrival date in `yyyy-MM-dd` format       |
| `checkOutDate` | string | Departure date in `yyyy-MM-dd` format     |

**Optional parameters:**

| Parameter       | Type   | Description                     |
| --------------- | ------ | ------------------------------- |
| `totalAdults`   | int    | Total adults across all rooms   |
| `totalChildren` | int    | Total children across all rooms |
| `totalRooms`    | int    | Number of rooms (1-10)          |
| `language`      | string | Preferred content language      |

**Response:** Returns:

* Complete property information (photos, amenities, check-in/check-out times)
* Room types, each containing room rates with:
  * `roomRateUuid` (required for booking)
  * `ratePlanName`, `breakfastIncluded`
  * Price breakdown: `totalPrice`, `taxes`, `fees`
  * `cancellationPolicy` with `policyType` and `freeCancellationUntilDays`
  * Commission breakdown

#### Step 3: Create Pending Reservation — `create_pending_reservation`

Temporarily hold rooms at a property. The hold expires after approximately 10 minutes.

**Required parameters:**

| Parameter      | Type   | Description                                         |
| -------------- | ------ | --------------------------------------------------- |
| `uuid`         | string | Property identifier (from search or export results) |
| `checkInDate`  | string | Arrival date in `yyyy-MM-dd` format                 |
| `checkOutDate` | string | Departure date in `yyyy-MM-dd` format               |
| `rooms`        | array  | Array of room objects (1-10 rooms)                  |

Each room object:

```json
{
  "roomRateUuid": "<from show_property results>",
  "adults": 2,
  "children": 0
}
```

**Optional parameters:**

| Parameter      | Type    | Description                                           |
| -------------- | ------- | ----------------------------------------------------- |
| `netInvoicing` | boolean | Deduct commission from booking amount (default false) |

**Response:** Returns:

* `bookingReferenceId` — Use this for confirmation
* `expiresInMinutes` — Time remaining to confirm (typically 10 minutes)
* `paymentTotal`, `currencyCode`
* `rooms` array, each with a `roomUuid` — **needed for confirmation**
* `cancellationPolicy`
* `taxes` and `fees` breakdown

> **IMPORTANT:** You must call `confirm_reservation` before the pending reservation expires.

#### Step 4: Confirm Reservation — `confirm_reservation`

Finalize the pending reservation with payment and guest details.

**Required parameters:**

| Parameter            | Type   | Description                                |
| -------------------- | ------ | ------------------------------------------ |
| `bookingReferenceId` | string | From `create_pending_reservation` response |
| `paymentMethod`      | string | `CreditCard` or `VirtualCreditCard`        |
| `cardNumber`         | string | Full credit card number (digits only)      |
| `cardholderName`     | string | Name on the card                           |
| `cardExpiry`         | string | Expiry in `MM/YYYY` format                 |
| `cardType`           | string | Card type code (see below)                 |
| `cardCvv`            | string | CVV (3-4 digits)                           |
| `guestTitle`         | string | e.g., `Mr.`, `Mrs.`, `Ms.`                 |
| `guestFirstName`     | string | Guest first name                           |
| `guestLastName`      | string | Guest last name                            |
| `guestEmail`         | string | Guest email address                        |
| `guestPhoneNumber`   | string | Guest phone number                         |
| `rooms`              | array  | Room guest details array                   |

Each room guest object:

```json
{
  "roomUuid": "<from create_pending_reservation response>",
  "guestTitle": "Mr.",
  "guestFirstName": "John",
  "guestLastName": "Doe",
  "guestRemarks": "Late check-in"
}
```

**Accepted card types:**

| Code | Card             |
| ---- | ---------------- |
| `AX` | American Express |
| `DN` | Diners Club      |
| `DS` | Discover         |
| `JC` | JCB              |
| `MC` | Mastercard       |
| `CU` | China UnionPay   |
| `VI` | Visa             |

> **Note:** The `cardType` must match one of the property's `acceptedCardTypes`. Using an unsupported card type will return a 400 error.

**Optional parameters:**

| Parameter       | Type   | Description      |
| --------------- | ------ | ---------------- |
| `guestAddress`  | string | Street address   |
| `guestCity`     | string | City             |
| `guestState`    | string | State or region  |
| `guestPostcode` | string | Postal code      |
| `guestCountry`  | string | Country          |
| `guestRemarks`  | string | Special requests |

**Virtual Credit Card (VCC) parameters** (required when `paymentMethod` is `VirtualCreditCard`):

| Parameter                 | Type    | Description                    |
| ------------------------- | ------- | ------------------------------ |
| `vccActivationDateTime`   | string  | ISO 8601 activation datetime   |
| `vccDeactivationDateTime` | string  | ISO 8601 deactivation datetime |
| `vccCurrency`             | string  | VCC currency code              |
| `vccBalance`              | decimal | VCC balance amount             |

***

### Post-Booking Operations

#### View Reservation — `show_reservation`

| Parameter            | Type   | Description              |
| -------------------- | ------ | ------------------------ |
| `bookingReferenceId` | string | The booking reference ID |

Returns: Reservation status (`Confirmed` or `Cancelled`), dates, payment total, taxes, fees, commission details, cancellation policy, and `nonRefundableDateTime`.

> Pending reservations return 404.

#### List Reservations — `list_reservations`

| Parameter  | Type   | Required | Description                             |
| ---------- | ------ | -------- | --------------------------------------- |
| `dateType` | string | Yes      | `checkIn`, `checkOut`, or `bookedOn`    |
| `fromDate` | string | Yes      | Start date (max 365 days in the past)   |
| `toDate`   | string | Yes      | End date (max 31 days from `fromDate`)  |
| `page`     | int    | No       | Page number (default 1)                 |
| `perPage`  | int    | No       | Results per page (max 200, default 100) |

#### Modify Reservation — `modify_reservation`

Update guest information on an existing reservation. Only non-price-impacting fields can be changed. Cannot modify after the check-in date.

| Parameter            | Type   | Required | Description                    |
| -------------------- | ------ | -------- | ------------------------------ |
| `bookingReferenceId` | string | Yes      | Booking reference ID           |
| `guestTitle`         | string | No       | Guest title                    |
| `guestFirstName`     | string | No       | Guest first name               |
| `guestLastName`      | string | No       | Guest last name                |
| `guestEmail`         | string | No       | Guest email                    |
| `guestPhoneNumber`   | string | No       | Guest phone                    |
| `guestAddress`       | string | No       | Street address                 |
| `guestCity`          | string | No       | City                           |
| `guestState`         | string | No       | State/region                   |
| `guestPostcode`      | string | No       | Postal code                    |
| `guestCountry`       | string | No       | Country                        |
| `guestRemarks`       | string | No       | Remarks/special requests       |
| `rooms`              | array  | No       | Room guest updates (see below) |

Room guest update object:

```json
{
  "roomUuid": "<room identifier>",
  "guestTitle": "Mrs.",
  "guestFirstName": "Jane",
  "guestLastName": "Doe",
  "guestRemarks": "Extra pillows"
}
```

> Provide only the fields you want to change — omitted fields remain unchanged.

#### Cancel Reservation — `cancel_reservation`

| Parameter            | Type   | Description          |
| -------------------- | ------ | -------------------- |
| `bookingReferenceId` | string | Booking reference ID |

**Constraints:**

* Only reservations with `policyType: "free-cancellation"` can be cancelled
* Must be within the free cancellation period (`freeCancellationUntilDays` before check-in date, in the property's local timezone)
* Attempting to cancel a non-refundable reservation returns an error (400)
* Already cancelled or pending reservations return an error (404)

***

### Property Content Export Workflow

The export tools are designed for property indexing and caching, separate from the booking workflow.

```
export_properties  →  export_property (per property)
  (enumerate)           (full content)
```

#### List All Properties — `export_properties`

| Parameter | Type | Required | Default | Description                                |
| --------- | ---- | -------- | ------- | ------------------------------------------ |
| `page`    | int  | No       | 1       | Page number                                |
| `perPage` | int  | No       | 100     | Results per page (max 500, multiple of 10) |

Returns: Array of `{ uuid, name }` for all shoppable properties.

> Requires `content` or `inventory` cache level permission on your channel.

#### Get Full Property Content — `export_property`

| Parameter   | Type   | Required | Description                           |
| ----------- | ------ | -------- | ------------------------------------- |
| `uuid`      | string | Yes      | Property identifier                   |
| `languages` | array  | No       | Language codes for translated content |

Returns comprehensive property data:

* Address, location, star rating, currency
* Amenities (translated), photos with position and captions
* Accepted card types
* Taxes (name, type, rate, application method)
* Fees (name, type, rate, application method)
* Commission percentages
* Check-in/check-out times, licenses
* Room types with:
  * Name, description, room area
  * Bed configurations (translated, with quantity)
  * Photos, amenities, views
  * Max occupancy (adults, children, total)
  * Room rates with rate plan details and cancellation policies

***

## Reference

### Data Models

#### Commission Structure

All pricing includes a commission breakdown:

```json
{
  "totalCommissionPercentage": 18.0,
  "siteminderCommissionPercentage": 3.0,
  "channelCommissionPercentage": 15.0
}
```

`totalCommissionPercentage = siteminderCommissionPercentage + channelCommissionPercentage`

#### Cancellation Policy

```json
{
  "policyType": "free-cancellation",
  "freeCancellationUntilDays": 3
}
```

| Policy Type         | Description                                              |
| ------------------- | -------------------------------------------------------- |
| `free-cancellation` | Can be cancelled up to N days before check-in            |
| `non-refundable`    | Cannot be cancelled; `freeCancellationUntilDays` is null |

#### Translated Text

Multi-language fields use the `TranslationText` structure:

{% code expandable="true" %}

```json
{
  "text": "Deluxe King Room",
  "language": "en"
}
```

{% endcode %}

#### Price Breakdown

{% code expandable="true" %}

```json
{
  "totalPrice": 350.00,
  "totalCommissionPercentage": 18.0,
  "siteminderCommissionPercentage": 3.0,
  "channelCommissionPercentage": 15.0
}
```

{% endcode %}

#### Tax and Fee Structure

{% code expandable="true" %}

```json
{
  "taxes": [
    { "name": "GST", "amount": 35.00 }
  ],
  "fees": [
    { "name": "Resort Fee", "amount": 25.00 }
  ]
}
```

{% endcode %}

For export data, taxes and fees include additional detail:

{% code expandable="true" %}

```json
{
  "taxes": [
    { "name": "GST", "taxType": "percentage", "rate": 10.0, "application": "per_stay" }
  ],
  "fees": [
    { "name": "Resort Fee", "feeType": "flat", "rate": 25.0, "application": "per_night" }
  ]
}
```

{% endcode %}

***

### Error Handling

There are three categories of errors:

#### 1. Authentication Errors (HTTP 401)

Returned when credentials are missing or invalid. This is an HTTP-level error, not a JSON-RPC response:

{% code expandable="true" %}

```json
{
  "errors": [
    {
      "code": "credentials_required",
      "message": "missing x-sm-api-id or x-sm-api-key"
    }
  ]
}
```

{% endcode %}

#### 2. Tool Execution Errors

When a tool call fails (e.g., invalid property UUID, expired reservation, validation error), the server returns a **successful JSON-RPC response** with `isError: true`:

{% code expandable="true" %}

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Unable to retrieve property details - HTTP 404: {\"errors\":[{\"code\":\"PropertyNotFoundError\",\"message\":\"property not found\"}]}"
      }
    ],
    "isError": true
  }
}
```

{% endcode %}

The `text` field contains a human-readable error message. Always check the `isError` field to distinguish errors from successful results.

Common error codes in the `text` field:

| HTTP Status | Meaning      | Common Causes                                                                                            |
| ----------- | ------------ | -------------------------------------------------------------------------------------------------------- |
| 400         | Bad Request  | Validation error, business rule violation (e.g., cancelling a non-refundable booking, invalid card type) |
| 404         | Not Found    | Invalid UUID, expired pending reservation, already cancelled reservation                                 |
| 429         | Rate Limited | Too many requests — wait for reset period                                                                |

#### 3. Protocol Errors

Returned for invalid JSON-RPC requests (e.g., unknown tool name, malformed params):

{% code expandable="true" %}

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,
    "message": "Unknown tool: invalid_tool_name",
    "data": "Tool not found: nonexistent_tool"
  }
}
```

{% endcode %}

***

### Multi-Language Support

Content is available in 8 languages:

| Code | Language   |
| ---- | ---------- |
| `de` | German     |
| `en` | English    |
| `es` | Spanish    |
| `fr` | French     |
| `id` | Indonesian |
| `it` | Italian    |
| `pt` | Portuguese |
| `th` | Thai       |

**Translated fields:** Property descriptions, property types, amenity names, room type names, bed configurations, and views.

If the requested language is unavailable, content falls back to the property's default language.

For booking tools (`list_properties`, `show_property`), pass a single `language` parameter. For export tools (`export_property`), pass a `languages` array to retrieve content in multiple languages simultaneously.

***

## Integration

### How It Works

In MCP, the **LLM autonomously discovers and calls tools**. Your code doesn't manually orchestrate the booking steps — it connects the LLM to the MCP server, and the LLM decides which tools to call based on the user's request.

For example, when a user says *"Find me a hotel in Sydney for May 1-3"*, the LLM will:

1. Discover available tools via `tools/list`
2. Call `list_properties` with the right parameters
3. Present results to the user
4. Call `show_property`, `create_pending_reservation`, `confirm_reservation` as the conversation progresses

#### MCP Client Configuration

Add the SiteMinder MCP server to your MCP client configuration:

{% code expandable="true" %}

```json
{
  "mcpServers": {
    "siteminder-channels-plus": {
      "url": "https://<mcp-server-host>/mcp",
      "headers": {
        "x-sm-api-id": "your-channel-id",
        "x-sm-api-key": "your-secret-key"
      }
    }
  }
}
```

{% endcode %}

This configuration works with any MCP-compatible client including Claude Desktop, Cursor, and custom agents built with the MCP SDK.

#### Building a Custom Agent (TypeScript)

If you're building your own agent, connect to the MCP server and pass the tools to your LLM:

{% code expandable="true" %}

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

// Connect to the MCP server
const transport = new StreamableHTTPClientTransport(
  new URL("https://<mcp-server-host>/mcp"),
  {
    requestInit: {
      headers: {
        "x-sm-api-id": "your-channel-id",
        "x-sm-api-key": "your-secret-key",
      },
    },
  }
);
const client = new Client({ name: "partner-agent", version: "1.0.0" });
await client.connect(transport);

// Discover available tools — pass these to your LLM
const { tools } = await client.listTools();

// In your agent loop, when the LLM requests a tool call:
const result = await client.callTool({
  name: toolCall.name,       // e.g. "list_properties"
  arguments: toolCall.arguments, // e.g. { latitude: -33.8688, ... }
});

// Check for errors before returning result to the LLM
if (result.isError) {
  // Handle tool error — the LLM can retry or inform the user
  console.error("Tool error:", result.content[0].text);
}

// Feed the result back to the LLM for the next step
```

{% endcode %}

#### Programmatic Use (Property Content Export)

The export tools are typically called programmatically (not via LLM) to build a local property catalog:

{% code expandable="true" %}

```typescript
// Enumerate all properties
const listResult = await client.callTool({
  name: "export_properties",
  arguments: { page: 1, perPage: 500 },
});
const allProperties = JSON.parse(listResult.content[0].text);

// Fetch full content for each property
for (const prop of allProperties.properties) {
  const contentResult = await client.callTool({
    name: "export_property",
    arguments: { uuid: prop.uuid, languages: ["en", "fr"] },
  });
  const content = JSON.parse(contentResult.content[0].text);
  // Store in your local catalog...
}
```

{% endcode %}

***

### Best Practices

#### Booking Flow

1. **Confirm promptly.** Pending reservations expire in \~10 minutes. Build your confirmation flow to complete within this window.
2. **Validate card types.** Before confirming, check the property's `acceptedCardTypes` to ensure the guest's card type is supported.
3. **Handle expiration gracefully.** If a pending reservation expires (404 on confirm), re-create it via `create_pending_reservation`.
4. **Check cancellation policy.** Before presenting cancellation options to users, verify the `policyType` and `nonRefundableDateTime`.

#### Data Constraints

| Constraint                             | Value                    |
| -------------------------------------- | ------------------------ |
| Max rooms per reservation              | 10                       |
| Date format                            | `yyyy-MM-dd`             |
| Max advance booking                    | 500 days                 |
| Length of stay                         | 1-30 nights              |
| Max date range for `list_reservations` | 31 days                  |
| Max lookback for `fromDate`            | 365 days                 |
| `perPage` for search                   | Max 100 (multiple of 10) |
| `perPage` for reservations             | Max 200 (multiple of 10) |
| `perPage` for export                   | Max 500 (multiple of 10) |

#### Property Content Caching

* Use the `export_properties` + `export_property` workflow for building and maintaining a local property catalog
* Refresh content periodically to pick up rate plan changes, new photos, and updated amenities
* The export API requires `content` or `inventory` cache level permission — request this during onboarding

#### Error Recovery

* On rate limit or server errors (429, 500+): Retry with exponential backoff (recommended: 1s, 2s, 4s, max 3 retries)
* On expired pending reservation (404): Re-create the pending reservation and confirm again
* On validation error (400): Do not retry — inspect the error message to identify the issue

#### Security

* Store `x-sm-api-key` and `x-sm-api-id` securely; never expose them in client-side code or logs
* Use HTTPS for all MCP server communication
* Ensure your systems comply with PCI DSS requirements when handling credit card data


# Properties

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Properties · **Direction:** SM → Channel · **Method:** Pull (Channel-initiated)
{% endhint %}

## GET /properties

> Search for properties within a specified radius of a location, with optional filters for amenities, star ratings, property type, and deals etc.\
> \
> \*\*Key Features:\*\*\
> \- Location-based search using latitude, longitude, and radius\
> \- Support for deal codes and deal-only filtering\
> \- Guest group allocation to match rooms with occupancy requirements\
> \- Optional filters for breakfast, free cancellation, swimming pool, and more\
> \- Sorting by distance or property name\
> \- Multi-language content support\
> \
> \*\*Response:\*\*\
> Returns an array of properties with their best available rates. Each property includes one or more room options with pricing. If deal codes are specified, the best available deal room rate for each supported deal code will also be provided. Properties without available inventory for the specified dates will be excluded.\
> \
> \*\*Note:\*\*\
> Results are paginated. Properties are sorted by distance (nearest first) by default.

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/properties":{"get":{"operationId":"listProperties","description":"Search for properties within a specified radius of a location, with optional filters for amenities, star ratings, property type, and deals etc.\n\n**Key Features:**\n- Location-based search using latitude, longitude, and radius\n- Support for deal codes and deal-only filtering\n- Guest group allocation to match rooms with occupancy requirements\n- Optional filters for breakfast, free cancellation, swimming pool, and more\n- Sorting by distance or property name\n- Multi-language content support\n\n**Response:**\nReturns an array of properties with their best available rates. Each property includes one or more room options with pricing. If deal codes are specified, the best available deal room rate for each supported deal code will also be provided. Properties without available inventory for the specified dates will be excluded.\n\n**Note:**\nResults are paginated. Properties are sorted by distance (nearest first) by default.","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"page","description":"The page number of the results to fetch","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"perPage","description":"The number of results per page. Must be a multiple of 10 (10, 20, 30, etc.). Use smaller values for faster response times, larger values to reduce API calls. Default: 20, Maximum: 100.","in":"query","schema":{"type":"integer","minimum":0,"maximum":100,"default":20,"multipleOf":10}},{"name":"latitude","description":"Latitude coordinate for the center of the search area. Used with longitude and radius to define a geospatial search circle. Valid range: -90 to 90 degrees.","required":true,"in":"query","schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"longitude","description":"Longitude coordinate for the center of the search area. Used with latitude and radius to define a geospatial search circle. Valid range: -180 to 180 degrees.","required":true,"in":"query","schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"radius","description":"The search radius in kilometers around the specified latitude and longitude. Properties within this distance from the center point will be included in results. Results are sorted by distance (nearest first) by default. Minimum: 15km, Maximum: 100km, Default: 15km.","in":"query","schema":{"type":"number","default":15,"minimum":15,"maximum":100}},{"name":"checkin","description":"The arrival date. Must be within 500 days in the future and in the format yyyy-mm-dd.","required":true,"in":"query","schema":{"type":"string","format":"date"}},{"name":"checkout","description":"The departure date. Must be later than checkin. Must be between 1 and 30 days after checkin. Must be within 500 days in the future and in the format yyyy-mm-dd.","required":true,"in":"query","schema":{"type":"string","format":"date"}},{"name":"rooms","description":"Specify exact occupancy for each room to get the pricing and availability. Provide an array of room objects with specific adult and child counts for each room.\n\n**Important Notes:**\n- Use this parameter for precise room allocation (e.g., Room 1: 2 adults + 1 child, Room 2: 2 adults)\n- **Mutually exclusive** with totalAdults/totalChildren/totalRooms parameters\n- Minimum 1 room, maximum 10 rooms\n\n**Example:** `[{\"adults\": 2, \"children\": 1}, {\"adults\": 2, \"children\": 0}]` for 2 rooms with different occupancies","in":"query","schema":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","additionalProperties":false,"properties":{"adults":{"type":"integer","minimum":0,"maximum":65535,"description":"Number of adults in this specific room"},"children":{"type":"integer","minimum":0,"maximum":65535,"description":"Number of children in this specific room"}},"required":["adults","children"]}}},{"name":"totalAdults","description":"Specify total adults across all rooms when exact per-room allocation is not needed. Must be used together with `totalRooms`. The system will distribute guests across rooms.\n\n**Use Case:** When you know the total guest count but not the specific room allocation.\n\n**Example:** `totalAdults=4, totalChildren=2, totalRooms=2` could match any room configuration that accommodates 4 adults and 2 children across 2 rooms.\n\n**Mutually exclusive** with the `rooms` parameter.","in":"query","schema":{"type":"integer","minimum":0}},{"name":"totalChildren","description":"Total number of children across all rooms. Must be used with `totalRooms`. **Mutually exclusive** with the `rooms` parameter.","in":"query","schema":{"type":"integer","minimum":0}},{"name":"totalRooms","description":"Total number of rooms needed. Must be used with `totalAdults` and/or `totalChildren`. The system will find room configurations that can accommodate the total guest count. **Mutually exclusive** with the `rooms` parameter.","in":"query","schema":{"type":"integer","minimum":1,"maximum":10}},{"name":"sortBy","description":"Specify the sorting criteria for the results.","in":"query","schema":{"type":"string","enum":["distance","name"],"default":"distance"}},{"name":"sortDirection","description":"Specify the sorting direction for the results.","in":"query","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}},{"name":"minStarRating","description":"Minimum star rating for properties in the results.","in":"query","schema":{"type":"number","enum":[1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6]}},{"name":"maxStarRating","description":"Maximum star rating for properties in the results.","in":"query","schema":{"type":"number","enum":[1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6]}},{"name":"propertyType","description":"Filter results to only include properties of a specific type. Common property types include: Hotel, Resort, Apartment, Guest House, Hostel, Motel, Villa, Bed & Breakfast, etc. This field is case-sensitive and must match the exact property type string configured in the system.","in":"query","schema":{"type":"string","maxLength":255}},{"name":"swimmingPoolAvailable","description":"Only return rates for properties that have a swimming pool.","in":"query","schema":{"type":"boolean"}},{"name":"breakfastIncluded","description":"Only return rates with breakfast included.","in":"query","schema":{"type":"boolean"}},{"name":"freeCancellation","description":"Only return rates with free cancellation periods.","in":"query","schema":{"type":"boolean"}},{"name":"dealCodes","description":"Return deal rates for properties participating in the specified deals. Provide one or more deal codes to include deal-specific pricing in the response. The API will validate that deals are active and applicable for the requested stay period.\n\n**Important Notes:**\n- When deal codes are provided, the response includes both standard rates and deal rates for each property\n- Each property may support different deal codes\n- Deal rates appear in the `prices` array within each room, with the `dealCode` field populated\n- Standard (non-deal) rates will have `dealCode` as null","in":"query","schema":{"type":"array","items":{"type":"string"}}},{"name":"dealOnly","description":"When set to true, only return properties that have active rates for the specified deal codes. Properties without the deal or without available deal inventory will be excluded from results. This parameter requires dealCodes to be specified.","in":"query","schema":{"type":"boolean"}},{"name":"language","description":"Specify the preferred language for returned content (property descriptions, room types, amenities). Falls back to the property's default language if the requested language is not available. Supported: de (German), en (English), es (Spanish), fr (French), id (Indonesian), it (Italian), pt (Portuguese), th (Thai).","in":"query","schema":{"type":"string","enum":["de","en","es","fr","id","it","pt","th"]}},{"name":"excludeSelfRated","in":"query","description":"Exclude self-rated properties from the response. Self-rated properties have star ratings assigned by the property owner rather than an official rating authority. Set to `true` to only include officially rated properties.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"successful","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of request allowed per number of seconds window. e.g. '100;w=60' means 100 request in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"}},"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"uuid":{"type":"string","description":"Unique identifier for the property."},"name":{"type":"string","description":"The name of the property."},"propertyType":{"$ref":"#/components/schemas/TranslationText","description":"The type of the property with language information."},"description":{"$ref":"#/components/schemas/TranslationText","description":"A description of the property with language information."},"address":{"type":"string","description":"The address of the property."},"suburb":{"type":"string","description":"The suburb where the property is located."},"state":{"type":"string","description":"The state or region where the property is located."},"country":{"type":"string","description":"The country where the property is located."},"email":{"type":"string","description":"The contact email for the property."},"phoneNumber":{"type":"string","description":"The contact phone number for the property."},"language":{"type":"string","maxLength":16,"description":"The primary language used by the property."},"latitude":{"type":"number","description":"The latitude coordinate of the property."},"longitude":{"type":"number","description":"The longitude coordinate of the property."},"checkinStartTime":{"type":"string","minLength":1,"maxLength":10,"description":"The earliest time guests can check in."},"checkinEndTime":{"type":"string","minLength":1,"maxLength":10,"description":"The latest time guests can check in."},"checkoutEndTime":{"type":"string","minLength":1,"maxLength":10,"description":"The latest time guests must check out."},"starRating":{"$ref":"#/components/schemas/StarRatings","description":"The star rating of the property."},"currency":{"type":"string","description":"The currency of the price"},"photo":{"$ref":"#/components/schemas/Photo","description":"A photo representing the property."},"amenities":{"type":"array","description":"Amenities that are available at this property","items":{"$ref":"#/components/schemas/TranslationText"}},"acceptedCardTypes":{"type":"array","description":"Credit card types accepted for payment at this property. Card type codes: AX (American Express), DN (Diners), DS (Discover), JC (JCB), MC (Mastercard), CU (China UnionPay), VI (Visa). When confirming a reservation, the card type provided must be in this list.","items":{"type":"string","enum":["AX","DN","DS","JC","MC","CU","VI"]},"minItems":1},"totalCommissionPercentage":{"type":"number","description":"The total commission percentage for bookings at this property. This represents the combined commission split between SiteMinder and the channel partner. Formula: `totalCommissionPercentage = siteminderCommissionPercentage + channelCommissionPercentage`"},"siteminderCommissionPercentage":{"type":"number","description":"SiteMinder's portion of the total commission percentage."},"channelCommissionPercentage":{"type":"number","description":"The channel partner's portion of the total commission percentage."},"rooms":{"type":"array","description":"Available rooms and their details.","items":{"type":"object","additionalProperties":false,"properties":{"roomRateUuid":{"type":"string","description":"Unique identifier for this room rate."},"roomTypeName":{"$ref":"#/components/schemas/TranslationText","description":"The name of the room type with language information."},"roomTypeDescription":{"$ref":"#/components/schemas/TranslationText","description":"A description of the room type with language information."},"ratePlanName":{"type":"string","description":"The name of the rate plan for this room. For Internal use only, not to be displayed to guests."},"breakfastIncluded":{"type":"boolean","description":"Indicates whether breakfast is included in the rate."},"roomArea":{"type":"string","description":"room area from room type with the unit of measurement","nullable":true},"photo":{"$ref":"#/components/schemas/Photo","description":"A photo of the room."},"amenities":{"type":"array","description":"Amenities that are available at this property","items":{"$ref":"#/components/schemas/TranslationText"}},"views":{"type":"array","description":"Views available from this room type (e.g., ocean view, city view, garden view, mountain view). Multiple views may be listed if the room type offers different view options. Each view is provided with language-specific translations.","items":{"$ref":"#/components/schemas/TranslationText"}},"bedConfigurations":{"type":"array","description":"Available bed configurations for this room type. Common bed types include: King, Queen, Double, Twin, Single, Sofa Bed, Bunk Bed. A room may have multiple bed types (e.g., 1 King + 1 Sofa Bed). Each bed type is provided with language-specific translations.","items":{"type":"object","additionalProperties":false,"properties":{"bedCode":{"$ref":"#/components/schemas/TranslationText","description":"The type of bed (e.g., \"King\", \"Queen\", \"Twin\") with language information."},"quantity":{"type":"number","minimum":1,"description":"The number of beds of this type in the room (e.g., 2 for \"2 Twin beds\")."}}}},"adults":{"type":"integer","description":"The number of adults this rate is for."},"children":{"type":"integer","description":"The number of children this rate is for."},"cancellationPolicy":{"$ref":"#/components/schemas/CancelationPolicy","description":"The cancellation policy for this room rate."},"prices":{"type":"array","description":"The pricing options for this room, including any applicable deals.","items":{"type":"object","additionalProperties":false,"properties":{"totalPrice":{"type":"number","minimum":0,"description":"The total price for the stay."},"dealCode":{"type":"string","description":"The code of any deal applied to this price."},"totalCommissionPercentage":{"type":"number","description":"The total commission percentage for this specific rate."},"siteminderCommissionPercentage":{"type":"number","description":"SiteMinder's portion of the commission for this rate."},"channelCommissionPercentage":{"type":"number","description":"The channel partner's portion of the commission for this rate."}},"required":["totalPrice","totalCommissionPercentage","siteminderCommissionPercentage","channelCommissionPercentage"]}},"rateType":{"type":"string","enum":["sell","net"],"description":"Indicates whether this is a sell rate or net rate."},"lowInventory":{"type":"boolean","description":"Indicates whether this room type has low inventory available. When `true`, only a few rooms remain for the specified dates, signaling scarcity to encourage booking. Use this flag to display urgency messaging (e.g., \"Only 2 rooms left!\") to guests."}},"required":["roomRateUuid","roomTypeName","ratePlanName","breakfastIncluded","adults","children","cancellationPolicy","rateType","prices","lowInventory"]}},"specialConditions":{"$ref":"#/components/schemas/SpecialConditions","description":"Special conditions that apply to this property."},"selfRated":{"type":"boolean","description":"Indicates if the rating is self-rated"}},"required":["uuid","name","address","state","country","phoneNumber","language","latitude","longitude","currency","checkinStartTime","checkoutEndTime","acceptedCardTypes","totalCommissionPercentage","siteminderCommissionPercentage","channelCommissionPercentage","rooms","specialConditions"]}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"schemas":{"TranslationText":{"type":"object","additionalProperties":false,"description":"Represents multilingual text content with language information. Used for property descriptions, amenities, room types, and other user-facing content.","properties":{"text":{"type":"string","description":"The translated text content in the specified language."},"language":{"type":"string","description":"ISO 639-1 language code indicating the language of the text. Supported languages: de (German), en (English), es (Spanish), fr (French), id (Indonesian), it (Italian), pt (Portuguese), th (Thai)."}},"required":["text","language"]},"StarRatings":{"type":"number","enum":[1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6]},"Photo":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","format":"uri","description":"The photo url"},"captions":{"type":"string","description":"The photo's captions"}},"required":["url"]},"CancelationPolicy":{"type":"object","additionalProperties":false,"description":"Defines the cancellation policy for a reservation or rate. Policies can be either non-refundable or allow free cancellation up to a specified number of days before check-in.","properties":{"policyType":{"type":"string","enum":["non-refundable","free-cancellation"],"description":"The type of cancellation policy. 'non-refundable' means no refund will be provided regardless of when cancellation occurs. 'free-cancellation' allows cancellation without penalty up to the specified number of days before check-in."},"freeCancellationUntilDays":{"type":"number","nullable":true,"description":"Number of days before check-in when free cancellation is allowed. Only applicable when policyType is 'free-cancellation'. Null for non-refundable policies. For example, a value of 7 means guests can cancel up to 7 days before check-in without penalty."}},"required":["policyType"]},"SpecialConditions":{"type":"object","additionalProperties":false,"nullable":true,"description":"Special conditions or exemptions that apply to a property. These conditions may affect pricing, taxation, or booking requirements.","properties":{"taxExemptions":{"type":"array","description":"Array of tax exemptions applicable to this property. Tax exemptions affect how taxes are calculated and displayed in the booking flow.","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","enum":["is-nz-gst-opt-out"],"description":"The name/type of the tax exemption. 'is-nz-gst-opt-out' indicates the property has opted out of New Zealand GST collection."}},"required":["name"]}}},"required":["taxExemptions"]},"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimitError":{"description":"The number of requests for the last 5 minutes window has reached the limit for the given channel","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of request allowed per number of seconds window. e.g. '100;w=60' means 100 request in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Property

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Properties · **Direction:** SM → Channel · **Method:** Pull (Channel-initiated)
{% endhint %}

## GET /properties/{uuid}

> Get detailed information and room rates for a specific property that satisfies the given search criteria. This endpoint provides more comprehensive data about a single property, including its room types and available rates.

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/properties/{uuid}":{"get":{"operationId":"showProperty","description":"Get detailed information and room rates for a specific property that satisfies the given search criteria. This endpoint provides more comprehensive data about a single property, including its room types and available rates.","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"uuid","description":"The unique identifier of the property","required":true,"in":"path","schema":{"type":"string"}},{"name":"checkin","description":"The arrival date. Must be within 500 days in the future and in the format yyyy-mm-dd.","required":true,"in":"query","schema":{"type":"string","format":"date"}},{"name":"checkout","description":"The departure date. Must be later than checkin. Must be between 1 and 30 days after checkin. Must be within 500 days in the future and in the format yyyy-mm-dd.","required":true,"in":"query","schema":{"type":"string","format":"date"}},{"name":"rooms","description":"Use the rooms list to specify exact occupants in each room. Provides more accurate pricing. Do not use this if searching by totalAdults, totalChildren & totalRooms.","in":"query","schema":{"type":"array","minItems":1,"maxItems":10,"items":{"type":"object","additionalProperties":false,"properties":{"adults":{"type":"integer","minimum":0,"maximum":65535,"description":"Number of adults in the room"},"children":{"type":"integer","minimum":0,"maximum":65535,"description":"Number of children in the room"}},"required":["adults","children"]}}},{"name":"totalAdults","description":"Specify the total number of adults across all rooms. Must also specify totalRooms field. Do not use this if searching with the occupants rooms list.","in":"query","schema":{"type":"integer","minimum":0,"maximum":655350}},{"name":"totalChildren","description":"Specify the total number of children across all rooms. Must also specify totalRooms field. Do not use this if searching with the occupants rooms list.","in":"query","schema":{"type":"integer","minimum":0,"maximum":655350}},{"name":"totalRooms","description":"Specify the total number of rooms. Must also specify totalAdults and/or totalChildren fields. Do not use this if searching with the occupants rooms list.","in":"query","schema":{"type":"integer","minimum":1,"maximum":10}},{"name":"dealCode","description":"Only return rates associated with the given deal code","in":"query","schema":{"type":"string"}},{"name":"language","description":"Specify the preferred language for returned content. Falls back to the property's default language if unavailable.","in":"query","schema":{"type":"string","enum":["de","en","es","fr","id","it","pt","th"]}}],"responses":{"200":{"description":"Successful response","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of requests allowed per number of seconds window. e.g. '100;w=60' means 100 requests in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"uuid":{"type":"string","description":"Unique identifier of the property"},"name":{"type":"string","description":"Name of the property"},"propertyType":{"$ref":"#/components/schemas/TranslationText","description":"Type of the property with language information"},"description":{"$ref":"#/components/schemas/TranslationText","description":"Detailed description of the property with language information"},"address":{"type":"string","description":"Street address of the property"},"suburb":{"type":"string","description":"Suburb where the property is located"},"state":{"type":"string","description":"State or region where the property is located"},"country":{"type":"string","description":"Country where the property is located"},"email":{"type":"string","description":"Contact email address for the property"},"phoneNumber":{"type":"string","description":"Contact phone number for the property"},"language":{"type":"string","maxLength":16,"description":"Primary language used by the property"},"latitude":{"type":"number","description":"Latitude coordinate of the property's location"},"longitude":{"type":"number","description":"Longitude coordinate of the property's location"},"checkinStartTime":{"type":"string","minLength":1,"maxLength":10,"description":"Earliest time guests can check in"},"checkinEndTime":{"type":"string","minLength":1,"maxLength":10,"description":"Latest time guests can check in"},"checkoutEndTime":{"type":"string","minLength":1,"maxLength":10,"description":"Latest time guests must check out"},"starRating":{"$ref":"#/components/schemas/StarRatings","description":"Star rating of the property"},"currency":{"type":"string","description":"Currency used for pricing at this property"},"photos":{"type":"array","description":"Array of photos representing the property","items":{"$ref":"#/components/schemas/Photo"}},"amenities":{"type":"array","description":"Amenities available at this property","items":{"$ref":"#/components/schemas/TranslationText"}},"acceptedCardTypes":{"type":"array","description":"Credit card types accepted at this property","items":{"type":"string","enum":["AX","DN","DS","JC","MC","CU","VI"]},"minItems":1},"totalCommissionPercentage":{"type":"number","description":"Total commission percentage for bookings at this property"},"siteminderCommissionPercentage":{"type":"number","description":"SiteMinder's portion of the commission percentage"},"channelCommissionPercentage":{"type":"number","description":"Channel partner's portion of the commission percentage"},"roomTypes":{"type":"array","description":"Array of room types available at this property","items":{"type":"object","additionalProperties":false,"properties":{"uuid":{"type":"string","description":"Unique identifier for this room type"},"name":{"$ref":"#/components/schemas/TranslationText","description":"Name of the room type with language information"},"description":{"$ref":"#/components/schemas/TranslationText","description":"Detailed description of the room type with language information"},"roomArea":{"type":"string","description":"Size of the room, including the unit of measurement","nullable":true},"photos":{"type":"array","description":"Array of photos representing the room type","items":{"$ref":"#/components/schemas/Photo"}},"amenities":{"type":"array","description":"Amenities available in this room type","items":{"$ref":"#/components/schemas/TranslationText"}},"views":{"type":"array","description":"Views available from this room type","items":{"$ref":"#/components/schemas/TranslationText"}},"bedConfigurations":{"type":"array","description":"Possible bed configurations for this room type","items":{"type":"object","additionalProperties":false,"properties":{"bedCode":{"$ref":"#/components/schemas/TranslationText","description":"Type of bed (e.g., \"King\", \"Twin\") with language information"},"quantity":{"type":"number","minimum":1,"description":"Number of beds of this type in the room"}}}},"roomRates":{"type":"array","description":"Available rates for this room type","items":{"type":"object","additionalProperties":false,"properties":{"uuid":{"type":"string","description":"Unique identifier for this room rate"},"ratePlanUuid":{"type":"string","description":"Unique identifier for the rate plan"},"ratePlanName":{"type":"string","description":"Name of the rate plan. For Internal use only, not to be displayed to guests."},"breakfastIncluded":{"type":"boolean","description":"Indicates if breakfast is included in the rate"},"totalPrice":{"type":"number","description":"Total price for the stay in this room","minimum":0},"taxes":{"type":"array","description":"Breakdown of taxes applicable to this rate","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","description":"Name of the tax"},"amount":{"type":"number","description":"Amount of the tax"}},"required":["name","amount"]}},"fees":{"type":"array","description":"Breakdown of fees applicable to this rate","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","description":"Name of the fee"},"amount":{"type":"number","description":"Amount of the fee"}},"required":["name","amount"]}},"adults":{"type":"integer","description":"Number of adults this rate is for"},"children":{"type":"integer","description":"Number of children this rate is for"},"cancellationPolicy":{"$ref":"#/components/schemas/CancelationPolicy","description":"Cancellation policy for this rate"},"dealCode":{"type":"string","description":"Code of any deal applied to this rate"},"totalCommissionPercentage":{"type":"number","description":"Total commission percentage for this specific rate"},"siteminderCommissionPercentage":{"type":"number","description":"SiteMinder's portion of the commission for this rate"},"channelCommissionPercentage":{"type":"number","description":"Channel partner's portion of the commission for this rate"},"rateType":{"type":"string","enum":["sell","net"],"description":"Indicates whether this is a sell rate or net rate."},"lowInventory":{"type":"boolean","description":"Indicates if this room type has low inventory available"}},"required":["uuid","ratePlanUuid","ratePlanName","breakfastIncluded","totalPrice","taxes","fees","adults","children","cancellationPolicy","totalCommissionPercentage","siteminderCommissionPercentage","channelCommissionPercentage","rateType","lowInventory"]}}},"required":["uuid","name"]}},"specialConditions":{"$ref":"#/components/schemas/SpecialConditions","description":"Special conditions that apply to this property."}},"required":["uuid","name","address","state","country","phoneNumber","language","latitude","longitude","checkinStartTime","checkoutEndTime","acceptedCardTypes","totalCommissionPercentage","siteminderCommissionPercentage","channelCommissionPercentage","currency","roomTypes","specialConditions"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"schemas":{"TranslationText":{"type":"object","additionalProperties":false,"description":"Represents multilingual text content with language information. Used for property descriptions, amenities, room types, and other user-facing content.","properties":{"text":{"type":"string","description":"The translated text content in the specified language."},"language":{"type":"string","description":"ISO 639-1 language code indicating the language of the text. Supported languages: de (German), en (English), es (Spanish), fr (French), id (Indonesian), it (Italian), pt (Portuguese), th (Thai)."}},"required":["text","language"]},"StarRatings":{"type":"number","enum":[1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6]},"Photo":{"type":"object","additionalProperties":false,"properties":{"url":{"type":"string","format":"uri","description":"The photo url"},"captions":{"type":"string","description":"The photo's captions"}},"required":["url"]},"CancelationPolicy":{"type":"object","additionalProperties":false,"description":"Defines the cancellation policy for a reservation or rate. Policies can be either non-refundable or allow free cancellation up to a specified number of days before check-in.","properties":{"policyType":{"type":"string","enum":["non-refundable","free-cancellation"],"description":"The type of cancellation policy. 'non-refundable' means no refund will be provided regardless of when cancellation occurs. 'free-cancellation' allows cancellation without penalty up to the specified number of days before check-in."},"freeCancellationUntilDays":{"type":"number","nullable":true,"description":"Number of days before check-in when free cancellation is allowed. Only applicable when policyType is 'free-cancellation'. Null for non-refundable policies. For example, a value of 7 means guests can cancel up to 7 days before check-in without penalty."}},"required":["policyType"]},"SpecialConditions":{"type":"object","additionalProperties":false,"nullable":true,"description":"Special conditions or exemptions that apply to a property. These conditions may affect pricing, taxation, or booking requirements.","properties":{"taxExemptions":{"type":"array","description":"Array of tax exemptions applicable to this property. Tax exemptions affect how taxes are calculated and displayed in the booking flow.","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","enum":["is-nz-gst-opt-out"],"description":"The name/type of the tax exemption. 'is-nz-gst-opt-out' indicates the property has opted out of New Zealand GST collection."}},"required":["name"]}}},"required":["taxExemptions"]},"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimitError":{"description":"The number of requests for the last 5 minutes window has reached the limit for the given channel","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of request allowed per number of seconds window. e.g. '100;w=60' means 100 request in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Lock Reservation

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Reservations · **Direction:** Channel → SM · **Method:** Push (Channel-initiated)
{% endhint %}

## POST /properties/{uuid}/reservations

> Create a pending reservation to lock in rates and availabilities for a specific property. This endpoint allows you to temporarily hold a reservation before confirming it, ensuring the rates and room availability are secured for a short period.\
> \
> \*\*Pending Reservation Workflow:\*\*\
> 1\. Call this endpoint to create a pending reservation\
> 2\. The response includes a \`bookingReferenceId\` and \`expiresInMinutes\`\
> 3\. Complete payment collection from the guest\
> 4\. Call \`/reservations/{bookingReferenceId}/confirmation\` before expiration\
> 5\. If not confirmed within the expiration window, the reservation is automatically released\
> \
> \*\*Room Allocation Rules:\*\*\
> \- Maximum 10 rooms per reservation\
> \- Each room must specify \`roomRateUuid\`, \`adults\`, and \`children\` count\
> \- The \`roomRateUuid\` must correspond to a valid rate returned from property search endpoints\
> \- Occupancy (\`adults\` + \`children\`) should not exceed the room type's maximum capacity\
> \- Use \`applyDeal\` per room to selectively apply deal rates when a \`dealCode\` is specified\
> \
> \*\*Deal Application:\*\*\
> \- Set \`dealCode\` at the reservation level to apply a deal\
> \- Use \`applyDeal: true\` for specific rooms to apply the deal rate to those rooms\
> \- Rooms with \`applyDeal: false\` or \`null\` will use standard rates even if a deal code is specified\
> \- This allows mixed bookings with both deal and non-deal rooms

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/properties/{uuid}/reservations":{"post":{"operationId":"createPendingReservation","description":"Create a pending reservation to lock in rates and availabilities for a specific property. This endpoint allows you to temporarily hold a reservation before confirming it, ensuring the rates and room availability are secured for a short period.\n\n**Pending Reservation Workflow:**\n1. Call this endpoint to create a pending reservation\n2. The response includes a `bookingReferenceId` and `expiresInMinutes`\n3. Complete payment collection from the guest\n4. Call `/reservations/{bookingReferenceId}/confirmation` before expiration\n5. If not confirmed within the expiration window, the reservation is automatically released\n\n**Room Allocation Rules:**\n- Maximum 10 rooms per reservation\n- Each room must specify `roomRateUuid`, `adults`, and `children` count\n- The `roomRateUuid` must correspond to a valid rate returned from property search endpoints\n- Occupancy (`adults` + `children`) should not exceed the room type's maximum capacity\n- Use `applyDeal` per room to selectively apply deal rates when a `dealCode` is specified\n\n**Deal Application:**\n- Set `dealCode` at the reservation level to apply a deal\n- Use `applyDeal: true` for specific rooms to apply the deal rate to those rooms\n- Rooms with `applyDeal: false` or `null` will use standard rates even if a deal code is specified\n- This allows mixed bookings with both deal and non-deal rooms","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"uuid","description":"The unique identifier of the property for which the reservation is being made","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"checkin":{"type":"string","format":"date","description":"The arrival date. Must be within 500 days in the future and in the format yyyy-mm-dd."},"checkout":{"type":"string","format":"date","description":"The departure date. Must be later than checkin. Must be between 1 and 30 days after checkin. Must be within 500 days in the future and in the format yyyy-mm-dd."},"dealCode":{"type":"string","nullable":true,"description":"The code of any deal to be applied to the reservation. If null, no deal will be applied."},"netInvoicing":{"type":"boolean","default":false,"description":"Indicates whether net invoicing should be applied to the reservation. When set to true, the commission is deducted from the booking amount, and the property receives the net amount (total minus commission)."},"rooms":{"type":"array","description":"An array of room bookings for this reservation. Minimum 1, maximum 10 rooms.","items":{"type":"object","additionalProperties":false,"properties":{"roomRateUuid":{"type":"string","maxLength":36,"description":"The unique identifier for the specific room rate being booked."},"adults":{"type":"integer","minimum":0,"maximum":255,"description":"The number of adults for this room booking."},"children":{"type":"integer","minimum":0,"maximum":255,"description":"The number of children for this room booking."},"applyDeal":{"type":"boolean","nullable":true,"description":"Indicates whether to apply the deal (if any) to this specific room booking."}},"required":["roomRateUuid","adults","children"]},"minItems":1,"maxItems":10}},"required":["checkin","checkout","rooms"]}}}},"responses":{"200":{"description":"Successful response. A pending reservation has been created.","headers":{},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"propertyUuid":{"type":"string","description":"The unique identifier of the property for which the reservation is made."},"propertyEmail":{"type":"string","description":"The contact email address for the property."},"propertyPhoneNumber":{"type":"string","description":"The contact phone number for the property."},"bookingReferenceId":{"type":"string","description":"The unique identifier for this pending reservation."},"expiresInMinutes":{"type":"number","description":"The number of minutes before the pending reservation expires and is no longer valid.","minimum":0},"currencyCode":{"type":"string","description":"The currency code for all monetary values in this response."},"paymentTotal":{"type":"number","description":"The total payment amount for the reservation, including all taxes and fees."},"paymentTotalLessCommission":{"type":"number","description":"The total payment amount minus the commission."},"taxes":{"type":"array","description":"An array of taxes applicable to this reservation.","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","description":"The name or type of the tax."},"amount":{"type":"number","description":"The amount of the tax."}},"required":["name","amount"]}},"fees":{"type":"array","description":"An array of fees applicable to this reservation.","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","description":"The name or type of the fee."},"amount":{"type":"number","description":"The amount of the fee."}},"required":["name","amount"]}},"rooms":{"type":"array","description":"An array of rooms included in this reservation.","items":{"additionalProperties":false,"properties":{"roomUuid":{"type":"string","description":"The unique identifier for this specific room."},"roomTypeName":{"type":"string","description":"The name of the room type."},"roomRateUuid":{"type":"string","minLength":1,"maxLength":36,"description":"The unique identifier for the rate plan applied to this room."},"adults":{"type":"integer","minimum":0,"description":"The number of adults for this room."},"children":{"type":"integer","minimum":0,"description":"The number of children for this room."},"paymentTotal":{"type":"number","description":"The total payment amount for this room."},"totalCommissionPercentage":{"type":"number","description":"The total commission percentage for this room booking."},"siteminderCommissionPercentage":{"type":"number","description":"SiteMinder's portion of the commission percentage for this room booking."},"channelCommissionPercentage":{"type":"number","description":"The channel partner's portion of the commission percentage for this room booking."}},"required":["roomUuid","roomTypeName","roomRateUuid","adults","children","paymentTotal","totalCommissionPercentage","siteminderCommissionPercentage","channelCommissionPercentage"]},"minItems":1,"maxItems":10},"licenses":{"type":"array","description":"An array of business licenses and permits applicable to this property or specific rooms. These may include hotel operating licenses, business registration numbers, or regulatory permits required in certain jurisdictions (e.g., Japan's inn operation licenses, Singapore hotel licenses). Display these to guests where legally required.","items":{"type":"object","additionalProperties":false,"properties":{"licenseType":{"type":"string","enum":["property","room"],"description":"Indicates whether the license applies to the entire property or to a specific room."},"licenseNumber":{"type":"string","description":"The official license or permit number issued by the regulatory authority."},"licenseIssueDate":{"type":"string","description":"The date when the license was issued, in YYYY-MM-DD format."}},"required":["licenseType","licenseNumber","licenseIssueDate"]}},"cancellationPolicy":{"$ref":"#/components/schemas/CancelationPolicy","description":"The cancellation policy applicable to this reservation."}},"required":["propertyUuid","propertyPhoneNumber","bookingReferenceId","expiresInMinutes","currencyCode","paymentTotal","paymentTotalLessCommission","rooms","cancellationPolicy"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"schemas":{"CancelationPolicy":{"type":"object","additionalProperties":false,"description":"Defines the cancellation policy for a reservation or rate. Policies can be either non-refundable or allow free cancellation up to a specified number of days before check-in.","properties":{"policyType":{"type":"string","enum":["non-refundable","free-cancellation"],"description":"The type of cancellation policy. 'non-refundable' means no refund will be provided regardless of when cancellation occurs. 'free-cancellation' allows cancellation without penalty up to the specified number of days before check-in."},"freeCancellationUntilDays":{"type":"number","nullable":true,"description":"Number of days before check-in when free cancellation is allowed. Only applicable when policyType is 'free-cancellation'. Null for non-refundable policies. For example, a value of 7 means guests can cancel up to 7 days before check-in without penalty."}},"required":["policyType"]},"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

{% hint style="warning" %}
If using a Virtual Credit Card you must adhere to the following rules:

* VCC Activation Date:
  * Must be on or before the last acceptable cancellation date
  * If the reservation is non refundable, must be on or before the booking date
  * Note: The last acceptable cancellation date is calculated by CheckinDate minus freeCancellationUntilDays
* VCC Deactivation Date:
  * Must be at least 7 days after checkout date
    {% endhint %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Confirm Reservation

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Reservations · **Direction:** Channel → SM · **Method:** Push (Channel-initiated)
{% endhint %}

## POST /reservations/{bookingReferenceId}/confirmation

> Confirm a pending reservation by providing guest details and payment information. This endpoint finalizes the booking process, transforming a temporary hold into a confirmed reservation.\
> \
> \*\*Payment Methods:\*\*\
> \- \`CreditCard\`: Standard credit card payment.\
> \- \`VirtualCreditCard\` (VCC): Virtual card issued for the booking. VCC details include activation/deactivation dates, currency, and balance.\
> \
> \*\*Credit Card Validation:\*\*\
> \- The card type provided must match one of the property's accepted card types\
> \- Invalid or expired cards will result in a 400 error\
> \
> \*\*Important Notes:\*\*\
> \- Pending reservations expire after the time specified in \`expiresInMinutes\` from the pending reservation response\
> \- Attempting to confirm an expired reservation will result in a 404 error\
> \- Room availability is re-validated during confirmation to ensure inventory is still available\
> \- Guest information provided during confirmation cannot be empty for required fields

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/reservations/{bookingReferenceId}/confirmation":{"post":{"operationId":"confirmReservation","description":"Confirm a pending reservation by providing guest details and payment information. This endpoint finalizes the booking process, transforming a temporary hold into a confirmed reservation.\n\n**Payment Methods:**\n- `CreditCard`: Standard credit card payment.\n- `VirtualCreditCard` (VCC): Virtual card issued for the booking. VCC details include activation/deactivation dates, currency, and balance.\n\n**Credit Card Validation:**\n- The card type provided must match one of the property's accepted card types\n- Invalid or expired cards will result in a 400 error\n\n**Important Notes:**\n- Pending reservations expire after the time specified in `expiresInMinutes` from the pending reservation response\n- Attempting to confirm an expired reservation will result in a 404 error\n- Room availability is re-validated during confirmation to ensure inventory is still available\n- Guest information provided during confirmation cannot be empty for required fields","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"bookingReferenceId","description":"The unique identifier of the pending reservation to be confirmed","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"paymentMethod":{"type":"string","enum":["CreditCard","VirtualCreditCard"],"description":"The method of payment for the reservation"},"cardNumber":{"type":"integer","description":"The full number of the credit card or virtual credit card"},"cardholderName":{"type":"string","description":"The name of the cardholder as it appears on the card"},"cardExpiry":{"type":"string","pattern":"^\\d{2}\\/\\d{4}$","description":"The expiry date of the card in MM/YYYY format"},"cardType":{"type":"string","enum":["AX","DN","DS","JC","MC","CU","VI"],"description":"The type of credit card (AX=American Express, DN=Diners, DS=Discover, JC=JCB, MC=Mastercard, CU=China UnionPay, VI=Visa)"},"cardCvv":{"type":"string","pattern":"^\\d{3,4}$","description":"The Card Verification Value (CVV) of the credit card"},"vccActivationDateTime":{"type":"string","format":"date-time","description":"VCC activation date/time. Expressed in ISO 8601 extended format. Date Format - YYYY-MM-DDThh:mm:ss<.sss>(+|-)hh:mm where <.sss> is optional and can be 1 to 3 digits."},"vccDeactivationDateTime":{"type":"string","format":"date-time","description":"VCC deactivation date/time. Expressed in ISO 8601 extended format. Date Format - YYYY-MM-DDThh:mm:ss<.sss>(+|-)hh:mm where <.sss> is optional and can be 1 to 3 digits."},"vccCurrency":{"type":"string","description":"The currency of the Virtual Credit Card (if applicable)"},"vccBalance":{"type":"number","description":"The balance available on the Virtual Credit Card (if applicable)"},"guestTitle":{"type":"string","description":"The title of the primary guest (e.g., Mr., Mrs., Ms., Dr.)"},"guestFirstName":{"type":"string","description":"The first name of the primary guest"},"guestLastName":{"type":"string","description":"The last name of the primary guest"},"guestEmail":{"type":"string","description":"The email address of the primary guest"},"guestPhoneNumber":{"type":"string","description":"The phone number of the primary guest"},"guestAddress":{"type":"string","nullable":true,"description":"The street address of the primary guest (optional)"},"guestCity":{"type":"string","nullable":true,"description":"The city of residence for the primary guest (optional)"},"guestState":{"type":"string","nullable":true,"description":"The state or region of residence for the primary guest (optional)"},"guestPostcode":{"type":"string","nullable":true,"description":"The postal or zip code of the primary guest (optional)"},"guestCountry":{"type":"string","nullable":true,"description":"The country of residence for the primary guest (optional)"},"guestRemarks":{"type":"string","nullable":true,"description":"Any additional remarks or special requests from the primary guest (optional)"},"rooms":{"type":"array","description":"An array of rooms in the reservation, each with its guest details","items":{"type":"object","additionalProperties":false,"properties":{"roomUuid":{"type":"string","minLength":1,"maxLength":36,"description":"The unique identifier of the room in the reservation"},"guestTitle":{"type":"string","description":"The title of the guest for this specific room"},"guestFirstName":{"type":"string","description":"The first name of the guest for this specific room"},"guestLastName":{"type":"string","description":"The last name of the guest for this specific room"},"guestRemarks":{"type":"string","nullable":true,"description":"Any additional remarks or special requests for this specific room (optional)"}},"required":["roomUuid","guestTitle","guestFirstName","guestLastName"]},"minItems":1,"maxItems":10}},"required":["paymentMethod","cardNumber","cardholderName","cardExpiry","cardType","cardCvv","guestTitle","guestFirstName","guestLastName","guestPhoneNumber","guestEmail","rooms"]}}}},"responses":{"200":{"description":"Successful response. The reservation has been confirmed successfully.","headers":{}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}}}}
```

{% hint style="warning" %}
If using a Virtual Credit Card you must adhere to the following rules:

* VCC Activation Date:
  * Must be on or before the last acceptable cancellation date
  * If the reservation is non refundable, must be on or before the booking date
  * Note: The last acceptable cancellation date is calculated by CheckinDate minus freeCancellationUntilDays
* VCC Deactivation Date:
  * Must be at least 7 days after checkout date
    {% endhint %}

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Modify Reservation

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Reservations · **Direction:** Channel → SM · **Method:** Push (Channel-initiated)
{% endhint %}

## PATCH /reservations/{bookingReferenceId}

> Modify an existing reservation. This endpoint allows updating guest information for the primary guest and individual room guests. Note that this endpoint can only modify non-price impacting details of the reservation.

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/reservations/{bookingReferenceId}":{"patch":{"operationId":"modifyReservation","description":"Modify an existing reservation. This endpoint allows updating guest information for the primary guest and individual room guests. Note that this endpoint can only modify non-price impacting details of the reservation.","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"bookingReferenceId","description":"The unique identifier of the reservation to be modified","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"guestTitle":{"type":"string","nullable":true,"description":"The title of the primary guest (e.g., Mr., Mrs., Ms., Dr.)"},"guestFirstName":{"type":"string","nullable":true,"description":"The first name of the primary guest"},"guestLastName":{"type":"string","nullable":true,"description":"The last name of the primary guest"},"guestEmail":{"type":"string","nullable":true,"description":"The email address of the primary guest"},"guestPhoneNumber":{"type":"string","nullable":true,"description":"The phone number of the primary guest"},"guestAddress":{"type":"string","nullable":true,"description":"The street address of the primary guest"},"guestCity":{"type":"string","nullable":true,"description":"The city of residence for the primary guest"},"guestState":{"type":"string","nullable":true,"description":"The state or region of residence for the primary guest"},"guestPostcode":{"type":"string","nullable":true,"description":"The postal or zip code of the primary guest"},"guestCountry":{"type":"string","nullable":true,"description":"The country of residence for the primary guest"},"guestRemarks":{"type":"string","nullable":true,"description":"Any additional remarks or special requests from the primary guest"},"rooms":{"type":"array","description":"An array of rooms in the reservation, allowing individual guest information updates","items":{"type":"object","additionalProperties":false,"properties":{"roomUuid":{"type":"string","description":"The unique identifier of the room in the reservation"},"guestTitle":{"type":"string","nullable":true,"description":"The title of the guest for this specific room"},"guestFirstName":{"type":"string","nullable":true,"description":"The first name of the guest for this specific room"},"guestLastName":{"type":"string","nullable":true,"description":"The last name of the guest for this specific room"},"guestRemarks":{"type":"string","nullable":true,"description":"Any additional remarks or special requests for this specific room"}},"required":["roomUuid"]},"maxItems":10}}}}}},"responses":{"200":{"description":"Successful response. The reservation has been modified successfully.","headers":{}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Cancel Reservation

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Reservations · **Direction:** Channel → SM · **Method:** Push (Channel-initiated)
{% endhint %}

## POST /reservations/{bookingReferenceId}/cancellation

> Cancel an existing confirmed reservation. This endpoint allows you to cancel a confirmed reservation that has a free cancellation policy.\
> \
> \*\*Important Business Rules:\*\*\
> \- Only reservations with \`policyType: "free-cancellation"\` can be cancelled via this endpoint\
> \- Non-refundable reservations (\`policyType: "non-refundable"\`) cannot be cancelled and will result in a 400 error\
> \- Cancellation must be requested within the free cancellation period (before \`freeCancellationUntilDays\` prior to check-in)\
> \- Attempts to cancel outside the cancellation period will result in a 400 error\
> \- Pending reservations (not yet confirmed) will return a 404 error\
> \- Already cancelled reservations will return a 404 error\
> \
> \*\*Cancellation Policy Calculation:\*\*\
> The cancellation deadline is calculated in the property's local timezone based on the \`freeCancellationUntilDays\` value from the cancellation policy. For example, if a reservation has a check-in date of 2024-01-15 and \`freeCancellationUntilDays: 7\`, the last day to cancel is 2024-01-08 (in the property's timezone).\
> \
> \*\*Successful Cancellation:\*\*\
> A 200 response indicates the cancellation was successful. The reservation status will be updated to "Cancelled".

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/reservations/{bookingReferenceId}/cancellation":{"post":{"operationId":"cancelReservation","description":"Cancel an existing confirmed reservation. This endpoint allows you to cancel a confirmed reservation that has a free cancellation policy.\n\n**Important Business Rules:**\n- Only reservations with `policyType: \"free-cancellation\"` can be cancelled via this endpoint\n- Non-refundable reservations (`policyType: \"non-refundable\"`) cannot be cancelled and will result in a 400 error\n- Cancellation must be requested within the free cancellation period (before `freeCancellationUntilDays` prior to check-in)\n- Attempts to cancel outside the cancellation period will result in a 400 error\n- Pending reservations (not yet confirmed) will return a 404 error\n- Already cancelled reservations will return a 404 error\n\n**Cancellation Policy Calculation:**\nThe cancellation deadline is calculated in the property's local timezone based on the `freeCancellationUntilDays` value from the cancellation policy. For example, if a reservation has a check-in date of 2024-01-15 and `freeCancellationUntilDays: 7`, the last day to cancel is 2024-01-08 (in the property's timezone).\n\n**Successful Cancellation:**\nA 200 response indicates the cancellation was successful. The reservation status will be updated to \"Cancelled\".","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"bookingReferenceId","description":"The unique identifier of the reservation to be cancelled","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. The reservation has been cancelled successfully. Note that a successful cancellation does not necessarily mean a full refund will be issued. Refunds are subject to the property's cancellation policy.","headers":{}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Reservations List

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Reservations · **Direction:** Channel → SM · **Method:** Push (Channel-initiated)
{% endhint %}

## GET /reservations

> Retrieve a list of reservations filtered by date type and a date range via fromDate & toDate. Max duration is 31 days. Only confirmed and cancelled reservations are returned.

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/reservations":{"get":{"operationId":"listReservations","description":"Retrieve a list of reservations filtered by date type and a date range via fromDate & toDate. Max duration is 31 days. Only confirmed and cancelled reservations are returned.","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"dateType","in":"query","description":"The type of date to filter reservations by. - `checkIn`: Filter by the guest's check-in date (arrival date) - `checkOut`: Filter by the guest's check-out date (departure date) - `bookedOn`: Filter by the date the reservation was created/booked","required":true,"schema":{"type":"string","enum":["checkIn","checkOut","bookedOn"]}},{"name":"fromDate","in":"query","required":true,"schema":{"type":"string","format":"date","description":"The start date of the date range (inclusive). Cannot be more than 365 days in the past."}},{"name":"toDate","in":"query","required":true,"schema":{"type":"string","format":"date","description":"The end date of the date range (inclusive)."}},{"name":"page","in":"query","description":"The page number of the results to fetch.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"perPage","in":"query","description":"The number of results per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":100,"multipleOf":10}}],"responses":{"200":{"description":"Successful response. Returns a list of reservations.","headers":{"link":{"schema":{"type":"string"},"description":"When a response is paginated, the response headers will include a link header. If the endpoint does not support pagination, or if all results fit on a single page, the link header will be omitted.\nThe link header contains URLs that you can use to fetch additional pages of results. For example, the previous, next, first, and last page of results.\ne.g. '<http://127.0.0.1/reservations?page=1>; rel=\"first\", <http://127.0.0.1/reservations?page=3>; rel=\"last\", <http://127.0.0.1/reservations?page=3>; rel=\"next\", <http://127.0.0.1/reservations?page=1>; rel=\"prev\"'\nThe URL for the previous page is followed by rel=\"prev\".\nThe URL for the next page is followed by rel=\"next\".\nThe URL for the last page is followed by rel=\"last\".\nThe URL for the first page is followed by rel=\"first\".\n"}},"content":{"application/json":{"schema":{"type":"array","description":"List of reservations.","items":{"type":"object","additionalProperties":false,"properties":{"bookingReferenceId":{"type":"string","description":"Unique identifier for the booking."},"propertyUuid":{"type":"string","description":"The unique identifier of the property for which the reservation is made."},"bookedOnDate":{"type":"string","format":"date","description":"The date the reservation was made."},"checkInDate":{"type":"string","format":"date","description":"The check-in date for the reservation."},"checkOutDate":{"type":"string","format":"date","description":"The check-out date for the reservation."},"currencyCode":{"type":"string","description":"The currency of the reservation amount."},"paymentTotal":{"type":"number","description":"The total reservation amount in the reservation currency."},"status":{"type":"string","enum":["Confirmed","Cancelled"],"description":"The status of the reservation."},"channelCommissionAmount":{"type":"number","description":"The channel commission amount in the reservation currency."}},"required":["bookingReferenceId","propertyUuid","bookedOnDate","checkInDate","checkOutDate","currencyCode","paymentTotal","status","channelCommissionAmount"]}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Reservation Detail

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Reservations · **Direction:** Channel → SM · **Method:** Push (Channel-initiated)
{% endhint %}

## GET /reservations/{bookingReferenceId}

> Returns information regarding a specific reservation based on the provided booking reference ID. Only confirmed and cancelled reservations will return results. Reservations in pending status will return 404.

```json
{"openapi":"3.0.0","info":{"title":"Channels Plus Channel API","version":"0.0.1"},"paths":{"/reservations/{bookingReferenceId}":{"get":{"operationId":"showReservation","description":"Returns information regarding a specific reservation based on the provided booking reference ID. Only confirmed and cancelled reservations will return results. Reservations in pending status will return 404.","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"bookingReferenceId","in":"path","required":true,"description":"The unique identifier of the reservation. Only one booking reference ID can be passed per request.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response","headers":{},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"bookingReferenceId":{"type":"string","description":"Unique identifier for the booking."},"propertyUuid":{"type":"string","description":"The unique identifier of the property for which the reservation is made."},"propertyName":{"type":"string","description":"The name of the property."},"bookedOnDate":{"type":"string","format":"date","description":"The date the reservation was made."},"checkInDate":{"type":"string","format":"date","description":"The check-in date for the reservation."},"checkOutDate":{"type":"string","format":"date","description":"The check-out date for the reservation."},"currencyCode":{"type":"string","description":"The booking currency of the reservation."},"paymentTotal":{"type":"number","description":"The total amount for the reservation, in the booking currency."},"totalTaxes":{"type":"number","description":"The total amount of taxes applied to the reservation, in the booking currency."},"totalFees":{"type":"number","description":"The total amount of fees applied to the reservation, in the booking currency."},"status":{"type":"string","enum":["Confirmed","Cancelled"],"description":"The status of the reservation."},"channelCommissionPercentage":{"type":"number","description":"The channel commission amount for the reservation, in the booking currency."},"channelCommissionAmount":{"type":"number","description":"The channel commission amount in the reservation currency."},"siteminderCommissionAmount":{"type":"number","description":"The SiteMinder commission amount for the reservation, in the booking currency."},"cancellationPolicy":{"$ref":"#/components/schemas/CancelationPolicy","nullable":true,"description":"The cancellation policy applicable to this reservation."},"nonRefundableDateTime":{"type":"string","format":"date-time","nullable":true,"description":"The datetime when the reservation becomes non-refundable, in the property's timezone."}},"required":["bookingReferenceId","propertyUuid","propertyName","bookedOnDate","checkInDate","checkOutDate","currencyCode","paymentTotal","totalTaxes","totalFees","status","channelCommissionPercentage","channelCommissionAmount","siteminderCommissionAmount","cancellationPolicy","nonRefundableDateTime"]}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"schemas":{"CancelationPolicy":{"type":"object","additionalProperties":false,"description":"Defines the cancellation policy for a reservation or rate. Policies can be either non-refundable or allow free cancellation up to a specified number of days before check-in.","properties":{"policyType":{"type":"string","enum":["non-refundable","free-cancellation"],"description":"The type of cancellation policy. 'non-refundable' means no refund will be provided regardless of when cancellation occurs. 'free-cancellation' allows cancellation without penalty up to the specified number of days before check-in."},"freeCancellationUntilDays":{"type":"number","nullable":true,"description":"Number of days before check-in when free cancellation is allowed. Only applicable when policyType is 'free-cancellation'. Null for non-refundable policies. For example, a value of 7 means guests can cancel up to 7 days before check-in without penalty."}},"required":["policyType"]},"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Export

Use the Export endpoints to retrieve property listings and static content from Channels Plus.

### Export Properties

[Export Properties](/channels-plus-api/reference/export/properties) returns a paginated list of property IDs on Channels Plus that you have access to.&#x20;

**Query parameters**

<table><thead><tr><th width="140.126708984375">Parameter</th><th width="353.40716552734375">Description</th><th width="133.91845703125">Default</th><th>Maximum</th></tr></thead><tbody><tr><td><code>page</code></td><td>Page number to retrieve</td><td><code>1</code></td><td>—</td></tr><tr><td><code>pageSize</code></td><td>Results per page. Must be a multiple of 10.</td><td><code>100</code></td><td><code>500</code></td></tr></tbody></table>

{% hint style="info" %}
If a property you previously received no longer appears in the response, the property is either no longer available to you or no longer available on Channels Plus. Remove the record of that property from your system.
{% endhint %}

### Export Property

[Export Property](/channels-plus-api/reference/export/property) returns all static content and room rates for a specific property.

**Query parameters**

<table><thead><tr><th width="139.52947998046875">Parameter</th><th>Description</th></tr></thead><tbody><tr><td><code>propertyId</code></td><td>UUID of the property whose content you wish to retrieve.</td></tr><tr><td><code>language</code></td><td>Language(s) in which to return content. Accepts an array. Supported values: <code>en</code>, <code>de</code>, <code>es</code>, <code>fr</code>, <code>it</code>, <code>id</code>, <code>pt</code>, <code>th</code>.</td></tr></tbody></table>

{% hint style="info" %}
The Export Property endpoint returns a full snapshot of the property. Replace your existing record with each new response you receive:

* **404 response** — the property is either no longer available to you or no longer available on Channels Plus. Remove the record from your system.
* **Room rate absent from response** — the room rate is either no longer available to you or no longer available on Channels Plus. Remove the record from your system.
  {% endhint %}

### Making a reservation using the Export API

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Properties

Returns a list of property IDs on Channels Plus that you have access to.

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Properties Export · **Direction:** SM → Channel · **Method:** Pull (Channel-initiated)
{% endhint %}

## GET /properties

> List properties for the channel

```json
{"openapi":"3.0.0","info":{"title":"channels-plus-export-api","version":"0.0.1"},"paths":{"/properties":{"get":{"operationId":"listProperties","description":"List properties for the channel","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"page","description":"The page number of the results to fetch","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"perPage","description":"The number of results per page","in":"query","schema":{"type":"integer","minimum":10,"maximum":500,"default":100,"multipleOf":10}}],"responses":{"200":{"description":"successful","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of request allowed per number of seconds window. e.g. '100;w=60' means 100 request in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"},"link":{"schema":{"type":"string"},"description":"When a response is paginated, the response headers will include a link header. If the endpoint does not support pagination, or if all results fit on a single page, the link header will be omitted.\nThe link header contains URLs that you can use to fetch additional pages of results. For example, the previous, next, first, and last page of results.\ne.g. '<http://127.0.0.1/properties?page=1>; rel=\"first\", <http://127.0.0.1/properties?page=3>; rel=\"last\", <http://127.0.0.1/properties?page=3>; rel=\"next\", <http://127.0.0.1/properties?page=1>; rel=\"prev\"'\nThe URL for the previous page is followed by rel=\"prev\".\nThe URL for the next page is followed by rel=\"next\".\nThe URL for the last page is followed by rel=\"last\".\nThe URL for the first page is followed by rel=\"first\".\n"}},"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"uuid":{"type":"string"},"name":{"type":"string"}},"required":["uuid","name"]}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimitError":{"description":"The number of requests for the last 5 minutes window has reached the limit for the given channel","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of request allowed per number of seconds window. e.g. '100;w=60' means 100 request in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Property

Returns all static content and room rates for a specific property.

{% hint style="info" %}
**API:** Channels Plus · **Operation:** Properties Export · **Direction:** SM → Channel · **Method:** Pull (Channel-initiated)
{% endhint %}

## GET /properties/{uuid}

> show room with the given uuid

```json
{"openapi":"3.0.0","info":{"title":"channels-plus-export-api","version":"0.0.1"},"paths":{"/properties/{uuid}":{"get":{"operationId":"showProperty","description":"show room with the given uuid","parameters":[{"$ref":"#/components/parameters/SmApiId"},{"$ref":"#/components/parameters/SmApiKey"},{"name":"uuid","description":"The uuid of the property","required":true,"in":"path","schema":{"type":"string"}},{"name":"languages","description":"The language codes for the property information","in":"query","schema":{"type":"array","items":{"type":"string","enum":["de","en","es","fr","id","it","pt","th"]}}}],"responses":{"200":{"description":"successful","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of request allowed per number of seconds window. e.g. '100;w=60' means 100 request in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"address":{"type":"string"},"suburb":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"phoneNumber":{"type":"string"},"emailAddress":{"type":"string"},"propertyType":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}},"description":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}},"language":{"type":"string"},"starRating":{"type":"number"},"currency":{"type":"string"},"amenities":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}},"unitsOfMeasurement":{"type":"string","description":"The units of measurement used for the property (m^2 or ft^2)"},"totalCommissionPercentage":{"type":"number"},"siteminderCommissionPercentage":{"type":"number"},"channelCommissionPercentage":{"type":"number"},"licenses":{"type":"array","items":{"type":"object","properties":{"licenseType":{"type":"string","enum":["property","room"]},"licenseNumber":{"type":"string"},"licenseIssueDate":{"type":"string"}},"required":["licenseType","licenseNumber","licenseIssueDate"]}},"checkinStartTime":{"type":"string"},"checkinEndTime":{"type":"string"},"checkoutEndTime":{"type":"string"},"photos":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"position":{"type":"integer"},"captions":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}}}}},"acceptedCardTypes":{"type":"array","items":{"type":"string","enum":["AX","DN","DS","JC","MC","CU","VI"]}},"taxes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"taxType":{"type":"string","enum":["percentage","fixed"]},"rate":{"type":"number"},"application":{"type":"string","enum":["per-room-per-night","per-stay"]}},"required":["name","taxType","rate","application"]}},"fees":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string"},"feeType":{"type":"string","enum":["percentage","fixed"]},"rate":{"type":"number"},"application":{"type":"string","enum":["per-room-per-night","per-stay"]}},"required":["name","feeType","rate","application"]}},"roomTypes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}},"uuid":{"type":"string"},"roomArea":{"type":"string"},"photos":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"position":{"type":"integer"},"captions":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}}}}},"description":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}},"bedConfigurations":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string"},"language":{"type":"string"},"quantity":{"type":"number","minimum":1}},"required":["text","language","quantity"]}},"amenities":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}},"views":{"type":"array","items":{"$ref":"#/components/schemas/TranslationText"}},"maxAdults":{"type":"number"},"maxChildren":{"type":"number"},"maxOccupancy":{"type":"number"},"roomRates":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"uuid":{"type":"string"},"ratePlanUuid":{"type":"string"},"ratePlanName":{"type":"string"},"breakfastIncluded":{"type":"boolean"},"cancellationPolicy":{"type":"object","properties":{"policyType":{"type":"string","enum":["non-refundable","free-cancellation"]},"freeCancellationUntilDays":{"type":"integer"}}}}}}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimitError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"SmApiId":{"name":"x-sm-api-id","description":"The api id for channel","required":true,"in":"header","schema":{"type":"string"}},"SmApiKey":{"name":"x-sm-api-key","description":"The api key for channel","required":true,"in":"header","schema":{"type":"string"}}},"schemas":{"TranslationText":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string"},"language":{"type":"string"}},"required":["text","language"]},"Error":{"type":"object","required":["errors"],"properties":{"errors":{"minItems":1,"type":"array","description":"An array of error objects, for most errors, this array would only contain one error object. An errors array must contain at least one error object.","items":{"type":"object","required":["code"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"meta":{"type":"object"}}}}}}},"responses":{"BadRequest":{"description":"Invalid request","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"The specified resource was not found","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimitError":{"description":"The number of requests for the last 5 minutes window has reached the limit for the given channel","headers":{"ratelimit-policy":{"schema":{"type":"string"},"description":"Shows the number of request allowed per number of seconds window. e.g. '100;w=60' means 100 request in a 60 seconds window."},"ratelimit-limit":{"schema":{"type":"integer"},"description":"The number of requests allowed per window"},"ratelimit-remaining":{"schema":{"type":"integer"},"description":"The number of requests left for the time window."},"ratelimit-reset":{"schema":{"type":"integer"},"description":"The number of seconds left for the window to reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected error occurred","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}
```

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# FAQ

Get answers to frequently asked questions about the Channels Plus API, including features, technical behaviour, and integration details.

## General

<details>

<summary>What is the channel code for Channels Plus?</summary>

The Channel code for Channels Plus is CHP. In the reservation that is passed to the property, Channels Plus will be the primary channel on the reservation and the channel that generated the reservation will be the Affiliate channel. This information is also passed to the property in the Reservation XML.

</details>

<details>

<summary>How properties setup and manage Channels Plus?</summary>

<https://help-platform.siteminder.com/en/articles/9036636-set-up-and-manage-channels-plus>

</details>

<details>

<summary>Channels Plus FAQ for properties</summary>

<https://help-platform.siteminder.com/en/articles/8952536-channels-plus-frequently-asked-questions>

</details>

<details>

<summary>What is the Channels Plus Commission Structure</summary>

Channel partners receive commission payments through one of two invoicing models:

**1. Gross Invoicing (Current Standard Implementation)**

This is the primary commission payment method currently used:

**Process Flow:**

1. Guest books through partner's platform
2. Partner provides guest's credit card OR Virtual Credit Card (VCC) with 100% booking funds
3. Hotel charges the card for the full reservation amount
4. **Monthly billing cycle**: Hotel receives invoice from Channels Plus for total commission owed on all reservations that checked out in the previous month
5. Hotel pays the commission invoice to SiteMinder
6. **SiteMinder pays the channel partner their commission share**

**2. Net Invoicing (Available for Approved Partners)**

This involves upfront commission collection:

**Process Flow:**

1. Guest books through partner's platform
2. **Partner collects 100% of booking funds upfront from guest**
3. Partner deducts total commission (their share + SiteMinder's share)
4. Partner provides VCC with **net amount** (booking total minus commissions)
5. Hotel charges the VCC for the net amount only
6. Monthly summary provided to hotel (no billing required)
7. **SiteMinder invoices partner separately for SiteMinder's commission portion**

#### Commission Structure

Each booking has three commission components:

* **Total Commission Percentage**: Combined commission for the booking
* **Channel Commission Percentage**: Partner's portion
* **SiteMinder Commission Percentage**: SiteMinder's portion

</details>

## Channel API

<details>

<summary>Why don't I see any response when calling the Confirm Reservation endpoint?</summary>

This is expected behavior. The Channels Plus API does not return a response body for the Confirm Reservation endpoint — the response content will be empty.

* If you receive an HTTP 200 OK status, it indicates that your request was successful and the reservation has been confirmed.
* If you receive a response containing error details, it means the request was unsuccessful, and the reservation was not confirmed.

</details>

<details>

<summary>What is freeCancellationUntilDays?</summary>

`freeCancellationUntilDays` specifies the number of days before check-in that a guest can cancel their booking without incurring a penalty.

For example, if the value is set to 10, the guest can cancel for free until 10 days prior to check-in. Any cancellations made after this period will incur a penalty of 100% of the booking amount.

</details>

<details>

<summary>When Using a Virtual Credit Card (VCC), What Are the Rules?</summary>

If using a Virtual Credit Card you must adhere to the following rules:

* VCC Activation Date:
  * Must be on or before the last acceptable cancellation date
  * If the reservation is non refundable, must be on or before the booking date
  * Note: The last acceptable cancellation date is calculated by CheckinDate minus freeCancellationUntilDays
* VCC Deactivation Date:
  * Must be at least 7 days after checkout date

</details>

<details>

<summary>What should be the currency of the VCC?</summary>

The Virtual Credit Card (VCC) must match the currency of the booking. For example, if the booking currency is EUR, the VCC must also be in EUR.

</details>

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Generate API Key

Use this page to generate a new API key for your Channels Plus integration in Partner Portal.

When you regenerate a key, Partner Portal creates a new current API key and keeps the previous key active as an expiring key for up to 7 days so you have time to rotate credentials on your side without interruption.

This process changes the API key only. Your API ID stays the same.

### Before you begin

* Make sure you know where your current Channels Plus API key is configured in your application or secret store.
* Plan to update your integration as soon as the new key is generated. The old key remains valid only until the expiry date shown in Partner Portal.

### Generate or regenerate your API key

1. Log in to Partner Portal and open the API Integration page.
2. In the Current API Credentials section, click Regenerate API key.
3. Review the confirmation message. Partner Portal warns that regenerating your API key will create a new key and set your current key to expire in 7 days.
4. Click Regenerate to continue.
5. Copy and securely store the new API key, then update your integration to use it before the old key expires.
6. Check the expiry date shown for the old key and use it as your deadline to complete the rotation.

<figure><img src="/files/f219zOZRo3fJDiHgb9ER" alt=""><figcaption></figcaption></figure>

> Figure 1: Regenerate API key confirmation dialog in Partner Portal.

### What happens after regeneration

* A new API key becomes your current key.
* Your previous key becomes an expiring key and remains valid for 7 days so you can complete the rotation safely.
* After the expiry period ends, the old key is no longer valid.
* If you regenerate again while an expiring key already exists, Partner Portal replaces the current key and keeps the existing expiring key as is.

### Best practices

* Update all services and environments that use the key as soon as the new key is generated.
* Store API keys in a secure secret manager or encrypted configuration store.
* Do not hardcode API keys in source code or expose them in client-side applications.
* Avoid regenerating again until you have confirmed all traffic is using the new key.

{% hint style="success" icon="sparkles" %}

## Still have questions?

Use the <i class="fa-gitbook-assistant">:gitbook-assistant:</i> **Ask** button at the top of the page to chat with our AI assistant — it can help you navigate the guide, understand requirements, and troubleshoot issues.

If you need more support, visit [Integration Support](/integration-support).
{% endhint %}


# Reference Tables

Find reference tables that support your integration with SiteMinder APIs, including technical values, configuration options, and predefined data.


# Document Type Code (DOC)

Lists codes identifying document types used in transactions.

<table><thead><tr><th width="112">Code</th><th width="656">Type</th></tr></thead><tbody><tr><td>1</td><td>Visa</td></tr><tr><td>2</td><td>Passport</td></tr><tr><td>3</td><td>Military identification</td></tr><tr><td>4</td><td>Drivers license</td></tr><tr><td>5</td><td>National identity document</td></tr><tr><td>6</td><td>Vaccination certificate</td></tr><tr><td>7</td><td>Alien registration number</td></tr><tr><td>8</td><td>Insurance policy number</td></tr><tr><td>9</td><td>Tax exemption number</td></tr><tr><td>10</td><td>Vehicle registration/license number</td></tr><tr><td>11</td><td>Border crossing card</td></tr><tr><td>12</td><td>Refugee travel document</td></tr><tr><td>13</td><td>Pilot's license</td></tr><tr><td>14</td><td>Permanent resident card</td></tr><tr><td>15</td><td>Redress number</td></tr><tr><td>16</td><td>Known traveler number</td></tr><tr><td>17</td><td>Non-standard</td></tr><tr><td>18</td><td>Merchant mariner</td></tr><tr><td>19</td><td>Air Nexus card</td></tr><tr><td>20</td><td>Crew member certificate</td></tr><tr><td>21</td><td>Passport card</td></tr><tr><td>22</td><td>Naturalization certificate</td></tr></tbody></table>


# Error Codes (ERR)

Contains codes for specific errors encountered within the API.

### General Errors

<table><thead><tr><th width="119">Code</th><th width="247">Name</th><th>Description</th></tr></thead><tbody><tr><td>187</td><td>System currently unavailable</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>448</td><td>System error</td><td><code>Invalid Username and/or Password</code></td></tr><tr><td>450</td><td>Unable to process</td><td>EXPLAIN REASON FOR FAILURE</td></tr></tbody></table>

### Update Errors

<table><thead><tr><th width="120">Code</th><th width="246">Name</th><th>Description</th></tr></thead><tbody><tr><td>137</td><td>Adult occupancy mismatch</td><td><code>Invalid included occupancy</code></td></tr><tr><td>249</td><td>Invalid rate code</td><td><code>Rate code not found for this hotel</code></td></tr><tr><td>321</td><td>Required field missing</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>375</td><td>Hotel not active</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>392</td><td>Invalid hotel code</td><td><code>Hotel not found for HotelCode=XXXXXX</code></td></tr><tr><td>397</td><td>Invalid number of adults</td><td><code>Invalid number of adults</code></td></tr><tr><td>402</td><td>Invalid room type</td><td><code>Room type code not found for this hotel</code></td></tr><tr><td>436</td><td>Rate does not exist</td><td>EXPLAIN REASON FOR FAILURE</td></tr><tr><td>783</td><td>Room or rate not found</td><td><code>Combination of room code and rate code not found for this hotel</code></td></tr><tr><td>842</td><td>Rate not loaded</td><td>EXPLAIN REASON FOR FAILURE</td></tr></tbody></table>


# Error Warning Types (EWT)

Defines types of warnings that accompany specific errors.

<table><thead><tr><th width="101">Code</th><th width="238">Name</th><th>Reason</th></tr></thead><tbody><tr><td>1</td><td>Unknown</td><td>Indicates an unknown error.</td></tr><tr><td>2</td><td>No implementation</td><td>Indicates that the target business system has no implementation for the intended request.</td></tr><tr><td>3</td><td>Biz rule</td><td>Indicates that the XML message has passed a low-level validation check, but that the business rules for the request message were not met.</td></tr><tr><td>4</td><td>Authentication</td><td>Indicates the message lacks adequate security credentials.</td></tr><tr><td>5</td><td>Authentication timeout</td><td>Indicates that the security credentials in the message have expired.</td></tr><tr><td>6</td><td>Authorization</td><td>Indicates the message lacks adequate security credentials.</td></tr><tr><td>7</td><td>Protocol violation</td><td>Indicates that a request was sent within a message exchange that does not align to the message.</td></tr><tr><td>8</td><td>Transaction model</td><td>Indicates that the target business system does not support the intended transaction-oriented operation.</td></tr><tr><td>9</td><td>Authentical model</td><td>Indicates the type of authentication requested is not recognized.</td></tr><tr><td>10</td><td>Required field missing</td><td>Indicates that an element or attribute that is required in by the schema (or required by agreement between trading partners) is missing from the message.</td></tr><tr><td>11</td><td>Advisory</td><td></td></tr><tr><td>12</td><td>Processing exception</td><td>Indicates that during processing of the request that a not further defined exception occurred.</td></tr><tr><td>13</td><td>Application error</td><td>Indicates that an involved backend application returned an error or warning, which is passed back in the response message.</td></tr></tbody></table>




---

[Next Page](/llms-full.txt/1)

