# PMS -> SM

{% 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 %}

## 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.md).
{% endhint %}

#### **Considerations**

* **Direction of Integration**: Unlike the standard [Rooms and Rates (SM -> PMS)](/pmsxchange-api/reference/rooms-and-rates/sm-to-pms.md) 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: `roomTypeCode`, `ratePlanCode`, `roomTypeName`, `ratePlanName`, `includedAdultOccupancy`, and `rateSetupType`.
* **Rate Setup Types**: The `rateSetupType` field indicates how the rate is configured in the PMS:
  * `Derived`: Rate is calculated from another rate (base rate). Derived rates should include `NO_RATES` in `unsupportedData`.
  * `Manual`: Rate is manually managed and can receive updates.
* **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.2"},"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":["roomTypeCode","ratePlanCode","roomTypeName","ratePlanName","includedAdultOccupancy","rateSetupType"],"properties":{"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"},"rateSetupType":{"type":"string","enum":["Derived","Manual"],"description":"Indicates how the rate is configured in the PMS. If the rate is 'Derived' in the PMS, we would expect that you would also include 'NO_RATES' in unsupportedData as the rate is not updatable."},"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":{"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.2"},"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.2"},"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.2"},"components":{"schemas":{"RoomRateMappingList":{"type":"array","description":"List of room rate mappings","items":{"$ref":"#/components/schemas/RoomRateMapping"}},"RoomRateMapping":{"type":"object","required":["roomTypeCode","ratePlanCode","roomTypeName","ratePlanName","includedAdultOccupancy","rateSetupType"],"properties":{"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"},"rateSetupType":{"type":"string","enum":["Derived","Manual"],"description":"Indicates how the rate is configured in the PMS. If the rate is 'Derived' in the PMS, we would expect that you would also include 'NO_RATES' in unsupportedData as the rate is not updatable."},"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.2"},"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.2"},"components":{"schemas":{"RoomRateMapping":{"type":"object","required":["roomTypeCode","ratePlanCode","roomTypeName","ratePlanName","includedAdultOccupancy","rateSetupType"],"properties":{"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"},"rateSetupType":{"type":"string","enum":["Derived","Manual"],"description":"Indicates how the rate is configured in the PMS. If the rate is 'Derived' in the PMS, we would expect that you would also include 'NO_RATES' in unsupportedData as the rate is not updatable."},"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/integration-support.md).
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developer.siteminder.com/pmsxchange-api/reference/rooms-and-rates/pms-to-sm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
