# SM -> PMS

{% 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 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.md).
{% 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.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":{"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":{"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.2"},"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.2"},"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.2"},"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.2"},"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.2"},"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.2"},"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.2"},"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.2"},"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.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"}}}}}}
```

## 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/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/restrictions/sm-to-pms.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.
