# SM -> PMS

## 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/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/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.
