# Payment Transaction Record

## 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 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 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 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 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/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/payment-transaction-record.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.
