{"info":{"_postman_id":"0d3a9f90-948b-44fe-8780-808ca912b446","name":"RoomPriceGenie OpenAPI","description":"<html><head></head><body><p>Welcome to the <strong>RoomPriceGenie API</strong>! This API is designed to help you seamlessly integrate our pricing tools into your system, offering powerful functionality to optimize your pricing data. While the API is fully operational and ready to use, please keep in mind that we’re actively refining and improving features.</p>\n<p>We’re committed to maintaining stability, and no breaking changes will be made without proper notice. However, you can expect periodic updates as we continue to enhance the API’s performance and capabilities. Your feedback is invaluable, and we encourage you to share your experiences and ideas to help us shape the future of the RoomPriceGenie API.</p>\n<p>To fully understand and make the most of the API, be sure to explore the multiple examples provided for each endpoint. These examples are tailored to different use cases and will help guide you through various scenarios.</p>\n<img src=\"https://content.pstmn.io/9dfb9b2b-d76c-473a-960b-6bce59054af7/Q2xlYW5TaG90IDIwMjQtMDctMTcgYXQgMTMuMzcuMjNAMngucG5n\" width=\"328\" height=\"216\">\n\n<h2 id=\"support\">Support</h2>\n<p>If you have any questions or need further clarification regarding our OpenAPI, please feel free to <a href=\"https://tinyurl.com/4em8dyjh\">reach out to us</a>. We’re here to assist you.</p>\n<h1 id=\"basic-flow\">Basic Flow</h1>\n<ol>\n<li><p>RoomPriceGenie creates the property account and provides the partner with <strong>credentials</strong> to connect the PMS/CM.</p>\n</li>\n<li><p>The partner sends an <code>inventory.update</code> with a complete list of <strong>Room Types</strong> and <strong>Rate Plans</strong> (if applicable).</p>\n</li>\n<li><p>RoomPriceGenie maps the inventory and prepares the account to receive ARI updates.</p>\n<ol>\n<li><em>The partner must</em> <em><strong>not send any ARI data</strong></em> <em>until RoomPriceGenie confirms that the account is ready.</em></li>\n</ol>\n</li>\n<li><p>Once confirmed, the partner sends a <strong>full ARI sync</strong> (12 or 18 months of data) and then continues sending real-time ARI updates whenever Availability, Rates or Restrictions change.</p>\n</li>\n<li><p>RoomPriceGenie sends price recommendations to the partner’s endpoint as soon as they are available.</p>\n</li>\n</ol>\n<h1 id=\"features\">Features</h1>\n<p>RoomPriceGenie supports multiple methods for calculating rates based on different occupancies and/or rate plans. Depending on the features supported by your product, there may be variations in the payloads and account configurations. Please read more about these differences below.</p>\n<h2 id=\"inventories\">Inventories</h2>\n<p>Inventories are a list of the Room Types and Rate Plans available for a particular property (hotel).</p>\n<h3 id=\"room-types\">Room Types</h3>\n<p>We support room types as:</p>\n<ul>\n<li><p><strong>Flat Rate Pricing</strong>: If you offer a single price for each room type, RoomPriceGenie will push a flat rate for that room type.</p>\n</li>\n<li><p><strong>Occupancy Pricing</strong>: If you support occupancy-based rates (per number of guests), please inform the minimum, maximum, and default occupancy for each room type. This information allows RoomPriceGenie to accurately calculate and adjust prices for different occupancy levels, optimizing your revenue.</p>\n</li>\n</ul>\n<h3 id=\"rate-plans\">Rate Plans</h3>\n<p>The Rate Plans can be defined as Independent or Dependent. These are internal terminology that we use at RoomPriceGenie.</p>\n<ul>\n<li><p><strong>Independent Rate Plans</strong> are available and can be linked to all room types or some of them. For example, the BAR Rate Plan can be used by any room type.</p>\n</li>\n<li><p><strong>Dependent Rate Plans</strong> are tied to a particular room type. For example, if you have a BAR rate plan for each room type, they will have a unique ID each.</p>\n</li>\n</ul>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\"rate_plan_name\": \"BAR\", \"rate_type_code\": \"BAR_ABC\", \"room_type_code\": \"ROOM_ABC\"}\n{\"rate_plan_name\": \"BAR\", \"rate_type_code\": \"BAR_XYZ\", \"room_type_code\": \"ROOM_XYZ\"}\n\n</code></pre>\n<h2 id=\"availability\"><strong>Availability</strong></h2>\n<p>You should provide number of rooms available to sell, and (optionally and nice to have) the number of rooms out-of-order for each room type and date.</p>\n<ul>\n<li><p>RoomPriceGenie can price <strong>12 months (366 days)</strong> or <strong>18 months (560 days)</strong> into the future, depending on the hotel’s subscription plan. We therefore expect partners to push availability and pricing data for the corresponding duration.</p>\n</li>\n<li><p>If your system supports it, you may add a setting in your app to match the plan duration. However, for simplicity and consistency, we recommend <strong>always sending 18 months</strong> of data if possible.</p>\n</li>\n<li><p>Partners must <strong>always keep availability up to date</strong>, continuously pushing new future dates as they open to ensure uninterrupted pricing coverage.</p>\n</li>\n</ul>\n<h2 id=\"prices\">Prices</h2>\n<ul>\n<li><p><strong>Room-Based Only</strong>: If your PMS/CM supports only one price for the room type and no rate plans, we will push a single price for each room type and date.</p>\n</li>\n<li><p><strong>Occupancy Based Pricing</strong>: RoomPriceGenie can dynamically calculate prices based on varying occupancy levels for specific room types and provide them for each occupancy level.</p>\n</li>\n<li><p><strong>Rate Plan Derivation</strong>: If your PMS/CM does not support rate plan derivation, RoomPriceGenie can calculate different prices for various rate plans (e.g., Non-Refundable) and seamlessly push these rates to your system.</p>\n</li>\n</ul>\n<h2 id=\"minimum-stay-restrictions\">Minimum Stay Restrictions</h2>\n<p>RoomPriceGenie supports syncing <strong>Minimum Stay restrictions</strong> between RoomPriceGenie and the PMS. These restrictions can be set by the user directly in RoomPriceGenie and automatically pushed to the PMS via the integration.</p>\n<p>Users can also leverage two other features within RoomPriceGenie to automate how minimum stay restrictions are applied or removed:</p>\n<h4 id=\"automate-minimum-stay-restrictions\"><strong>Automate Minimum Stay Restrictions</strong></h4>\n<p>Users can set up rules to <strong>automatically remove or adjust minimum stay restrictions</strong> based on proximity to the arrival date. For example, a user might configure RoomPriceGenie to <strong>remove all minimum stay restrictions within 2 days of arrival</strong>, making it easier to sell remaining inventory last-minute.</p>\n<h4 id=\"orphan-gap-correction\"><strong>Orphan Gap Correction</strong></h4>\n<p>This feature helps prevent unbookable gaps in the calendar. If a minimum stay restriction exceeds the number of available consecutive nights (due to surrounding full dates), RoomPriceGenie will <strong>automatically reduce the restriction</strong> to fit the available gap.</p>\n<p><strong>Example</strong>: If a 4-night minimum stay is applied on a Thursday, but only 3 consecutive nights are actually available due to nearby full occupancy, the system will adjust the minimum stay to 3 nights.</p>\n<h1 id=\"test-account\">Test Account</h1>\n<p>When you begin development your integration, we will provide you with <strong>API credentials</strong> and a <strong>sandbox account</strong> for testing. The sandbox account is a dedicated testing environment that allows you to experiment freely without affecting live production data. Initially, you will notice that the <strong>Calendar</strong> and <strong>Room Setup</strong> pages in the sandbox account are empty. This is expected and part of the setup process, which is explained below.</p>\n<h3 id=\"room-setup\">Room Setup</h3>\n<p>After sending inventory data (Room Types and Rate Plans) to RoomPriceGenie, you will notice that <strong>the room types do not automatically appear in the Room Setup page</strong>. This is because the rooms in our system need to be manually mapped to match your data.</p>\n<p>To quickly add all room types into the account, you can click on <strong>1. Setup All Rooms</strong>, choose any Room Types from the list, and a rate plan, if applicable. All room types should appear in the screen now.</p>\n<p>Don't worry about the number of rooms at this point.</p>\n<img src=\"https://content.pstmn.io/9e280348-e7ab-474a-84ea-c13f8c0badd4/aW1hZ2UucG5n\" width=\"310\" height=\"240\">\n\n<p>If you prefer, our team can handle the mapping for you—just <a href=\"https://tinyurl.com/4em8dyjh\">send us an email</a> and we’ll take care of it.</p>\n<p>To map additional room types, click the <strong>Add New Room Type</strong> button and repeat the process until all room types and rate plans have been configured.</p>\n<img src=\"https://content.pstmn.io/5b0db4e8-d65e-475a-b3fd-5152a75953a9/Q2xlYW5TaG90IDIwMjQtMTEtMjkgYXQgMTIuMzguMDdAMngucG5n\" width=\"283\" height=\"236\">\n\n<h3 id=\"availability-and-prices\">Availability and Prices</h3>\n<p>Whenever you send availability and prices data to RoomPriceGenie, the updates are not immediately reflected on the calendar. This is because the calendar automatically refreshes approximately every hour. However, if you want to see the changes immediately, you can force an update manually.</p>\n<p>To do this, click on the three dots menu located in the top-right corner of the page and select the <strong>Run Pricing</strong> option. You can then specify the period of time you wish to update and confirm by clicking Run Pricing. The calendar will refresh to display the latest availability and prices after this action.</p>\n<img src=\"https://content.pstmn.io/f4aa30fc-d0f1-41a1-895e-da41cde6c64f/Q2xlYW5TaG90IDIwMjQtMTEtMjkgYXQgMTIuNDAuMTVAMngucG5n\" width=\"261\" height=\"149\">\n\n<h3 id=\"uploading-prices\">Uploading Prices</h3>\n<p>When you are ready to receive prices from RoomPriceGenie, you can initiate the process by clicking the <strong>Upload Prices</strong> button, located in the top menu of your account. Then, choose the specific time period for which you want to receive the prices and click on the Upload Prices button.</p>\n<p>If you need all prices for the selected date range to be sent again, you can enable the <strong>Upload All Prices</strong> checkbox. This ensures that every price within the chosen time frame is resent, regardless of whether it has changed. If you leave this option unchecked, only updated or changed prices will be sent to you.</p>\n<p>You can also <strong>send prices for a single day</strong>, by clicking on a date in the calendar, and pressing the Upload Prices button at the bottom. This will send you the prices for all room types (and occupancies, if relevant) for that day.</p>\n<h1 id=\"branding\">Branding</h1>\n<p>Any mention of <strong>RoomPriceGenie</strong> in your application must follow the correct spelling — a single word with a capital <strong>R</strong>, <strong>P</strong>, and <strong>G</strong>. Please ensure it is always used exactly as shown. Incorrect variations (e.g., “Room Price Genie” or “roompricegenie”) are not accepted.</p>\n<p>If you’d like to include our logo in your application, official assets are <a href=\"https://roompricegenie.com/brand-guidelines/#logo\">available here</a>.</p>\n<h1 id=\"future-requirements\">Future Requirements</h1>\n<p>RoomPriceGenie may request additional development work to enhance integration quality. This documentation will be updated as new requirements arise.</p>\n<ul>\n<li><p><strong>Quick Connect</strong>: Allows users to quickly create an account and connect to RoomPriceGenie with a seamless experience.</p>\n</li>\n<li><p><strong>Request Endpoint</strong>: The partner will need to accept requests from RoomPriceGenie so we can have the most updated data on our side. For example, we could trigger a request for a 365-days availability, whenever we feel our data is incorrect or outdated.</p>\n</li>\n</ul>\n<h1 id=\"frequently-asked-questions\">Frequently Asked Questions</h1>\n<h2 id=\"reservations-data\">Reservations Data</h2>\n<h3 id=\"revenue\"><strong>Revenue</strong></h3>\n<p><strong>Q: How should I report revenue when multiple charges of the same type occur on the same day?</strong></p>\n<p>A: Each stay date entry should have only one value per revenue field. Sum all charges of the same type into a single amount. For example, if there are two F&amp;B charges of €20 and €30 on the same day, report <code>fnb_gross_amount</code> as €50 — not two separate entries.</p>\n<p><strong>Q: How should I report a charge that applies to the entire stay rather than a specific night?</strong></p>\n<p>A: Follow how your PMS distributes it in its own reports. If the PMS spreads the amount evenly across all nights, report it that way. If it posts the full amount on the first or last night, do the same. Do not redistribute costs yourself — the goal is for your data to match your PMS reporting.</p>\n<p><strong>Q: What is the difference between</strong> <strong><code>rate_gross_amount</code></strong> <strong>and</strong> <strong><code>room_revenue_gross_amount</code>****?</strong></p>\n<p>A: They measure different things. <code>rate_gross_amount</code> is the original room rate before any discounts or adjustments — the rack rate for that day. <code>room_revenue_gross_amount</code> is the actual accommodation revenue charged, after any discounts or surcharges. If there are no adjustments, both values will be the same.</p>\n<p><strong>Q: How should I report revenue posted on a date outside the reservation's arrival/departure window?</strong></p>\n<p>A: Send it using the actual date it was posted in your PMS, even if that falls before arrival or after departure. Include it as an entry in <code>stay_dates</code> using that date, and associate it with a room type. Any entry outside the stay window is treated as revenue-only and will not count as a room night. Set <code>number_of_adults</code> to <code>0</code> for these entries.</p>\n<p><strong>Q: Should I send revenue that is not tied to a specific reservation?</strong></p>\n<p>A: No. Only send revenue directly associated with a guest reservation. Do not include revenue from house accounts, walk-in bar or restaurant charges, external invoices, or any other income your PMS records independently of room bookings.</p>\n<h3 id=\"stay-dates--room-types\"><strong>Stay Dates &amp; Room Types</strong></h3>\n<p><strong>Q: Should I report non-overnight room types such as conference rooms?</strong></p>\n<p>A: No. The <code>stay_dates</code> array should only represent overnight accommodation — guest rooms and similar residential units. Non-overnight spaces such as conference rooms or meeting rooms should not be included.</p>\n<p>notionvc: 9c7e1af0-71cb-44f5-8aa2-b884deac0475</p>\n<h2 id=\"glossary\"><strong>Glossary</strong></h2>\n<ul>\n<li><p><strong>Inventory</strong>: The complete list of Room Types and Rate Plans available at a property.</p>\n</li>\n<li><p><strong>Occupancy Pricing</strong>: This is unrelated to Hotel Occupancy. It’s about the minimum and maximum number of guests allowed in a room type. Properties can set a price based on the number of guests. For instance, a Double Room can be booked for $100 for 2 people, but the hotel can offer it for $20 less if booked for 1 person.</p>\n</li>\n<li><p><strong>Arrival-based Minimum Stay:</strong> A restriction that applies <strong>only if the guest’s check-in date matches the restricted date</strong>. For example, if there is a 3-night minimum stay set for Friday, it means that <strong>only guests arriving on Friday</strong> must stay at least 3 nights. Guests arriving on other days are not affected by this restriction.</p>\n</li>\n<li><p><strong>Stay-Through-based Minimum Stay:</strong> A restriction that requires a booking to <strong>include the restricted date</strong> within a stay of at least the specified number of nights. For example, if a 3-night stay-through restriction is set for Friday, any reservation that includes Friday must have a minimum length of 3 nights—regardless of the arrival date.</p>\n</li>\n<li><p><strong>UUID4</strong>: A universally unique identifier (UUID) of version 4, which is randomly generated. It must be generated by the partner for each API request sent to RoomPriceGenie to ensure unique identification of the request. [<a href=\"https://www.uuidtools.com/what-is-uuid\">More info</a>]</p>\n</li>\n<li><p><strong>property_id</strong>: The RoomPriceGenie Account ID, which is associated with a specific property, such as a hotel or other accommodation provider.</p>\n</li>\n<li><p><strong>HTTP POST endpoint</strong>: A URL provided by the partner where RoomPriceGenie can send HTTP POST requests, typically expecting to handle JSON-formatted data. [<a href=\"https://www.lonti.com/blog/understanding-http-methods-in-rest-api-development#:~:text=The%20POST%20method%20explained,to%20the%20server%20for%20processing.\">More info</a>]</p>\n</li>\n<li><p>The <strong>server-backend</strong> variable refers to the Base URL for RoomPriceGenie’s endpoints. Partners will receive both the Development and Production URLs when they begin development. It’s important to store these URLs as variables to ensure that the Development endpoint is used during testing, and the Production endpoint is used when going live.</p>\n</li>\n</ul>\n<h2 id=\"error-messages\"><strong>Error Messages</strong></h2>\n<p>When interacting with the RoomPriceGenie API, you may encounter error responses. Each error message is structured to provide clear details about the issue, including the type of error, its location, a descriptive message, and the input that caused the error. Below is a breakdown of the error response fields:</p>\n<ul>\n<li><p><strong>type</strong>: The category of the error (e.g., “missing”, “invalid”, \"parsing\", etc...).</p>\n</li>\n<li><p><strong>loc</strong>: The location in the payload where the error occurred, typically referencing a specific field.</p>\n</li>\n<li><p><strong>msg</strong>: A descriptive message explaining the issue and what is expected.</p>\n</li>\n<li><p><strong>input</strong>: The value that caused the error, or null if no value was provided.</p>\n</li>\n<li><p><strong>ctx</strong>: Additional context about the error.</p>\n</li>\n</ul>\n<p><strong>Example Error Response</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"UUID4\",\n    \"property_code\": \"property_code\",\n    \"errors\": [\n    {\n        \"type\": \"missing\",\n        \"loc\": \"data[0].calendar[0].prices\",\n        \"msg\": \"Field required\",\n        \"input\": null\n    },\n    {\n        \"type\": \"date_from_datetime_parsing\",\n        \"loc\": \"data[0].calendar[0].start_date\",\n        \"msg\": \"Input should be a valid date or datetime, input is too short\",\n        \"input\": \"20-01-01\",\n        \"ctx\":\n        {\n            \"error\": \"input is too short\"\n        }\n    }]\n}\n\n</code></pre>\n<h1 id=\"changelog\">Changelog</h1>\n<ul>\n<li><p>19/Jul/2024: First revision published</p>\n</li>\n<li><p>28/Aug/2024: Improved explanation on Authentication flow</p>\n</li>\n<li><p>24/Sep/2024: Moved Restrictions endpoints to Future Implementations, as this is not required at the moment.</p>\n</li>\n<li><p>19/Nov/2024: Updated <em>Public Keys Notification</em> payload</p>\n</li>\n<li><p>29/Nov/2024: Added basic instructions on how to use the provided test account for development.</p>\n</li>\n<li><p>21/Mar/2025: Added documentation for Minimum Stay Restrictions, including feature overview and payload structures for updates to and from RoomPriceGenie.</p>\n</li>\n<li><p>20/Jun/2025: Added documentation for Reservations payload, for enabling Reporting and Forecasting feature for the integrations.</p>\n</li>\n<li><p>29/Jan/2026: Added documentation for Revenue Intelligence SDK.</p>\n</li>\n</ul>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Basic Flow","slug":"basic-flow"},{"content":"Features","slug":"features"},{"content":"Test Account","slug":"test-account"},{"content":"Branding","slug":"branding"},{"content":"Future Requirements","slug":"future-requirements"},{"content":"Frequently Asked Questions","slug":"frequently-asked-questions"},{"content":"Changelog","slug":"changelog"}],"owner":"30934063","collectionId":"0d3a9f90-948b-44fe-8780-808ca912b446","publishedId":"2sA3e5dTaG","public":true,"customColor":{"top-bar":"5B48EE","right-sidebar":"303030","highlight":"5b48ee"},"publishDate":"2026-01-29T17:50:03.000Z"},"item":[{"name":"🔐 Authentication","item":[{"name":"Get Token","event":[{"listen":"test","script":{"id":"240b72db-798f-453b-894b-9c26d581a9b3","exec":[""],"type":"text/javascript","packages":{},"requests":{}}}],"id":"4e54762b-4b89-4cfa-8444-9f9ad3d05d91","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded","type":"text"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text"},{"key":"client_id","value":"{{hotel_client_id}}","type":"text"},{"key":"client_secret","value":"{{hotel_secret}}","type":"text"}]},"url":"{{server-backend}}/integrations/token/","description":"<p><strong>Obtaining Access and Refresh Tokens</strong></p>\n<p>To interact with our API securely, you will need to obtain a JSON Web Token (JWT). For each API request, you must include a <strong>Partner API Key</strong> (<code>X-API-Key</code>) in the request header. Additionally, each property account will have a unique <code>client_id</code> and <code>client_secret</code> for authentication.</p>\n<p>These credentials—your Partner API Key, client ID, and client secret—will be provided to you by RoomPriceGenie.</p>\n<p>The <code>access_token</code> is valid for 24 hours and the <code>refresh_token</code> only expires if not used within 7 days.</p>\n<p>We expect you to <strong>store</strong> both the access and refresh tokens and only request a new access token using the <strong>refresh token endpoint</strong> when needed. Please avoid requesting new access tokens directly unless the refresh token has expired. This helps optimize security and performance.</p>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"{{open_api_partner_api_key}}"}]},"isInherited":true,"source":{"_postman_id":"7417127f-2a55-48aa-903d-28331bcabc29","id":"7417127f-2a55-48aa-903d-28331bcabc29","name":"🔐 Authentication","type":"folder"}},"urlObject":{"path":["integrations","token",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"573b7b5e-a50c-4f08-ba15-f04ccab95287","name":"Get Token","originalRequest":{"method":"POST","header":[{"key":"X-API-Key","value":"partner-api-key"},{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials"},{"key":"client_id","value":"{{hotel_client_id}}"},{"key":"client_secret","value":"{{hotel_secret}}"}]},"url":"{{server-backend}}/integrations/token/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n\t\"expires_in\": 86400,\n\t\"access_token\": \"eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk3YzhkNDFjZTI3NzRkNjM4MDA4NGIzMGY0ZjFiY2RhIiwidHlwIjoiSldUIn0...\",\n\t\"token_type\": \"Bearer\",\n\t\"refresh_token\": \"uzxRKpATTWdV2GabXqGwi52L2CjGBWZP42WyiZdenqm...\",\n\t\"refresh_token_expires_in\": 300397\n}"}],"_postman_id":"4e54762b-4b89-4cfa-8444-9f9ad3d05d91"},{"name":"Refresh Token","id":"93eb5f83-ae03-4052-818e-e9033ccd537a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"refresh_token"},{"key":"client_id","value":"{{hotel_client_id}}"},{"key":"refresh_token","value":"{{refresh_token}}"}]},"url":"{{server-backend}}/integrations/token/","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"{{open_api_partner_api_key}}"}]},"isInherited":true,"source":{"_postman_id":"7417127f-2a55-48aa-903d-28331bcabc29","id":"7417127f-2a55-48aa-903d-28331bcabc29","name":"🔐 Authentication","type":"folder"}},"urlObject":{"path":["integrations","token",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"ecd8e345-ae0f-4527-994f-8b88cc6a55b1","name":"Refresh Token","originalRequest":{"method":"POST","header":[{"key":"X-API-Key","value":"{{partner_api_key}}"},{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"refresh_token"},{"key":"client_id","value":"{{hotel_client_id}}"},{"key":"refresh_token","value":"{{hotel_refresh_token}}"}]},"url":"{{server-backend}}/integrations/token/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n\t\"expires_in\": 86400,\n\t\"access_token\": \"eyJhbGciOiJSUzI1NiIsImtpZCI6IjE0YzFiMDYzYjQ2YjRjYzk5ZDUxZjU5ZWJhZDZlZWY5IiwidHlwIjoiSldUIn0....\",\n\t\"token_type\": \"Bearer\",\n\t\"refresh_token\": \"uzxRKpATTWdV2GabXqGwi52L2CjGBWZP42...\",\n\t\"refresh_token_expires_in\": 604800\n}"}],"_postman_id":"93eb5f83-ae03-4052-818e-e9033ccd537a"},{"name":"Retrieve JSON Web Keys","id":"28230fbc-5735-425b-a3f6-3dfba28cbc37","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{server-backend}}/integrations/jwk/","description":"<h3 id=\"🔐-validating-bearer-tokens-with-jwk\"><strong>🔐 Validating Bearer Tokens with JWK</strong></h3>\n<p>If you want to validate the Bearer token included in requests from RoomPriceGenie, follow these steps:</p>\n<ol>\n<li><p><strong>Fetch the JWK Set</strong> using this endpoint</p>\n</li>\n<li><p><strong>Store the Keys:</strong> Cache the full key set locally. RoomPriceGenie keeps up to 3 active keys and rotates them infrequently.</p>\n</li>\n<li><p><strong>Read the</strong> <strong><code>kid</code></strong> <strong>from the Token:</strong> Each Bearer token includes a kid (Key ID) in its header.</p>\n</li>\n<li><p><strong>Find and Use the Matching Key:</strong> Use the <code>kid</code> to select the correct key from your stored set and verify the token signature.</p>\n</li>\n<li><p><strong>Handle Key Changes:</strong> If the <code>kid</code> is not found, fetch the JWK Set again.</p>\n</li>\n</ol>\n<p>RoomPriceGenie also sends push notifications when keys are rotated—update your store when notified.</p>\n<p>To assist with this implementation, we recommend the following resources:</p>\n<ul>\n<li><p><a href=\"https://jwt.io/introduction\">Introduction to JSON Web Tokens</a></p>\n</li>\n<li><p><a href=\"https://auth0.com/docs/secure/tokens/json-web-tokens/validate-json-web-tokens\">Validate JSON Web Tokens</a></p>\n</li>\n<li><p><a href=\"https://jwt.io\">JWT Debugger</a></p>\n</li>\n<li><p><a href=\"https://jwt.io/libraries\">Libraries for Token Signing/Verification</a></p>\n</li>\n</ul>\n","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"{{open_api_partner_api_key}}"}]},"isInherited":true,"source":{"_postman_id":"7417127f-2a55-48aa-903d-28331bcabc29","id":"7417127f-2a55-48aa-903d-28331bcabc29","name":"🔐 Authentication","type":"folder"}},"urlObject":{"path":["integrations","jwk",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"d8e9e4a8-2985-4f16-8925-44e03e51aa64","name":"Retrieve JWK","originalRequest":{"method":"GET","header":[{"key":"X-API-Key","value":"partner-api-key","type":"text"}],"url":"{{server-backend}}/integrations/jwk"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"key\": [\n    {\n      \"e\": \"AQAB\",\n      \"key_ops\": [\"verify\"],\n      \"kid\": \"11111111111111111111111111111111\",\n      \"kty\": \"RSA\",\n      \"n\": \"uX1mY9m0DUMMY_PUBLIC_MODULUS_VALUE_0000000000000000000000000000000000000000000000000000000000000000000000\"\n    },\n    {\n      \"e\": \"AQAB\",\n      \"key_ops\": [\"verify\"],\n      \"kid\": \"22222222222222222222222222222222\",\n      \"kty\": \"RSA\",\n      \"n\": \"vZ2nA8p1DUMMY_PUBLIC_MODULUS_VALUE_1111111111111111111111111111111111111111111111111111111111111111111111\"\n    },\n    {\n      \"e\": \"AQAB\",\n      \"key_ops\": [\"verify\"],\n      \"kid\": \"33333333333333333333333333333333\",\n      \"kty\": \"RSA\",\n      \"n\": \"wA3pB7q2DUMMY_PUBLIC_MODULUS_VALUE_2222222222222222222222222222222222222222222222222222222222222222222222\"\n    }\n  ],\n  \"info\": [\n    {\n      \"kid\": \"11111111111111111111111111111111\",\n      \"expiry_date\": \"2099-01-01T00:00:00Z\"\n    },\n    {\n      \"kid\": \"22222222222222222222222222222222\",\n      \"expiry_date\": \"2099-02-01T00:00:00Z\"\n    },\n    {\n      \"kid\": \"33333333333333333333333333333333\",\n      \"expiry_date\": \"2099-03-01T00:00:00Z\"\n    }\n  ]\n}"}],"_postman_id":"28230fbc-5735-425b-a3f6-3dfba28cbc37"},{"name":"Public Key Notification (JWT)","id":"51cd607a-7f3f-4c0b-b5d6-158775cf03e1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"<token>"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"x-api-key","value":"{{partner_api_key}}","type":"text"}],"body":{"mode":"raw","raw":"{\n   \"event\": \"public_key\",\n   \"tracking_id\": \"2f7a6d3e-9b4b-4d1e-9f8a-1c2d3e4f5a6b\",\n   \"data\": [\n      {\n         \"type\": \"added\",\n         \"key\": {\n            \"kid\": \"b3c1d2e3-4f56-47a8-9bcd-0123456789ab\",\n            \"kty\": \"RSA\",\n            \"alg\": \"RS256\",\n            \"e\": \"AQAB\",\n            \"n\": \"uX1mY9m0DUMMY_PUBLIC_MODULUS_VALUE_0000000000000000000000000000000000000000000000000000000000000000000000\"\n         }\n      },\n      {\n         \"type\": \"deleted\",\n         \"key\": {\n            \"kid\": \"c0ffee00-1234-4abc-9def-1234567890ab\",\n            \"kty\": \"RSA\",\n            \"alg\": \"RS256\",\n            \"e\": \"AQAB\",\n            \"n\": \"vZ2nA8p1DUMMY_PUBLIC_MODULUS_VALUE_1111111111111111111111111111111111111111111111111111111111111111111111\"\n         }\n      }\n   ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"https://partnerdomain.com/endpoint","description":"<h1 id=\"public-key-events\">Public Key Events</h1>\n<p>RoomPriceGenie <strong>rotates its public keys regularly</strong> for security purposes, and partners will be notified whenever a new key is added or an existing one is deprecated or removed.</p>\n<p>To ensure you have the most up-to-date keys for verifying our messages, we will regularly send public key notifications to your endpoint. At any given time, there will always be three active keys, which are rotated monthly for enhanced security. Additionally, you can request the current set of keys at any time using the GET method described above.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td><code>public_key</code></td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>A unique identifier for tracking (UUID4)</td>\n</tr>\n<tr>\n<td><code>data.type</code></td>\n<td><code>added</code> or <code>deleted</code></td>\n</tr>\n<tr>\n<td><code>data.e</code></td>\n<td>The exponent value for the RSA key</td>\n</tr>\n<tr>\n<td><code>data.key.key_ops</code></td>\n<td>Indicates the key is used for verifying signatures.</td>\n</tr>\n<tr>\n<td><code>data.key.kid</code></td>\n<td>Key ID, a unique identifier for the key</td>\n</tr>\n<tr>\n<td><code>data.key.kty</code></td>\n<td>Key type</td>\n</tr>\n<tr>\n<td><code>data.key.n</code></td>\n<td>The modulus value for the RSA key</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"protocol":"https","path":["endpoint"],"host":["partnerdomain","com"],"query":[],"variable":[]}},"response":[{"id":"93ee62af-b69a-4108-ae2a-18b6a4a74743","name":"Public Key Notification (JWT)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer access_token","type":"text"},{"key":"x-api-key","value":"partner_api_key","type":"text"}],"body":{"mode":"raw","raw":"{\n   \"event\": \"public_key\",\n   \"tracking_id\": \"2f7a6d3e-9b4b-4d1e-9f8a-1c2d3e4f5a6b\",\n   \"data\": [\n      {\n         \"type\": \"added\",\n         \"key\": {\n            \"kid\": \"b3c1d2e3-4f56-47a8-9bcd-0123456789ab\",\n            \"kty\": \"RSA\",\n            \"alg\": \"RS256\",\n            \"e\": \"AQAB\",\n            \"n\": \"uX1mY9m0DUMMY_PUBLIC_MODULUS_VALUE_0000000000000000000000000000000000000000000000000000000000000000000000\"\n         }\n      },\n      {\n         \"type\": \"deleted\",\n         \"key\": {\n            \"kid\": \"c0ffee00-1234-4abc-9def-1234567890ab\",\n            \"kty\": \"RSA\",\n            \"alg\": \"RS256\",\n            \"e\": \"AQAB\",\n            \"n\": \"vZ2nA8p1DUMMY_PUBLIC_MODULUS_VALUE_1111111111111111111111111111111111111111111111111111111111111111111111\"\n         }\n      }\n   ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{}"}],"_postman_id":"51cd607a-7f3f-4c0b-b5d6-158775cf03e1"}],"id":"7417127f-2a55-48aa-903d-28331bcabc29","auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"X-API-Key"},{"key":"value","value":"{{open_api_partner_api_key}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"3e94456e-3bdc-48a8-bb3b-dbe85a1cac6c","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"9a18206e-3a05-4b39-846b-37052181c151","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"7417127f-2a55-48aa-903d-28331bcabc29","description":""},{"name":"💰 Pricing Integration","item":[{"name":"🏨 Property ARI Updates","item":[{"name":"Inventories (Rooms and Rate Plans)","id":"24f5aeae-218b-4bcf-8511-1dc9248de4d2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-API-Key","value":"partner-api-key"}],"body":{"mode":"raw","raw":"{\n   \"event\": \"inventory.update\",\n   \"tracking_id\": \"UUID4\",\n   \"property_code\": \"property_code\",\n   \"data\": {\n      \"room_types\": [\n         {\n            \"room_type_code\": \"SGL\",\n            \"room_type_name\": \"Single Room\",\n            \"default_occupancy\": 2,\n            \"min_occupancy\": 2,\n            \"max_occupancy\": 3,\n            \"number_of_rooms\": 11\n         },\n         {\n            \"room_type_code\": \"DBL\",\n            \"room_type_name\": \"Double Room\",\n            \"default_occupancy\": 2,\n            \"min_occupancy\": 1,\n            \"max_occupancy\": 3,\n            \"number_of_rooms\": 10\n         }\n      ],\n      \"rate_plans\": [\n         {\n            \"rate_plan_code\": \"BAR\",\n            \"rate_plan_name\": \"Best Available Rate\",\n            \"room_type_code\": \"SGL\" // Only if Rate Plan is Dependent of Room Type\n         },\n         {\n            \"rate_plan_code\": \"BAR\",\n            \"rate_plan_name\": \"Best Available Rate\",\n            \"room_type_code\": \"DBL\" // Only if Rate Plan is Dependent of Room Type\n         }\n      ]\n   }\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/","description":"<p>The <strong>Inventory</strong> is the information about the <strong>Room Types</strong> and <strong>Rate Plans</strong> (if applicable) for a property. This message must be sent <strong>once</strong> during account setup and whenever there are changes to room types or rate plans in the PMS/CM. Depending on the features supported on the PMS/CM, the data may vary.</p>\n<p><strong>🧠 Important Notes</strong>:</p>\n<ul>\n<li><p>Room Type Code and Rate Plan Code must be an immutable ID on your side, that the user should not be able to change. This is to avoid any disruption in the integration.</p>\n</li>\n<li><p>After sending the initial <code>inventory.update</code>, <strong>do not send any further messages</strong> until we confirm the mapping is complete and the account is ready to receive ARI updates.</p>\n</li>\n<li><p><strong>Do not</strong> send this regularly. Only send an <code>inventory.update</code> when there are actual changes—such as a room type or rate plan being added or removed—and always include the <strong>full list</strong> of inventories, not just the changes. Each message <strong>fully replaces</strong> the existing inventory on our side.</p>\n</li>\n<li><p>If any previously mapped room type or rate plan is missing from the list you send, it will be automatically un-mapped on our side.</p>\n</li>\n<li><p>If your system supports both room-level and occupancy-based pricing, then for any room type that should be priced as a whole (not per occupancy), set <code>min_occupancy</code>, <code>max_occupancy</code>, and <code>default_occupancy</code> to 1.</p>\n</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>String</td>\n<td><code>inventory.update</code>  <br /><code>inventory.response</code></td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>String (UUID4)</td>\n<td>Unique identifier for tracking the event.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td>String</td>\n<td>Code representing the property.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>Object</td>\n<td>Container for the data related to the event.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data.room_types</code></td>\n<td>Array of Objects</td>\n<td>List of room types available in the property.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data.room_types[].room_type_code</code></td>\n<td>String</td>\n<td>Immutable Code or ID representing the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data.room_types[].room_type_name</code></td>\n<td>String</td>\n<td>Name of the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data.room_types[].default_occupancy</code></td>\n<td>Integer</td>\n<td>Default occupancy for the room type.</td>\n<td>Required for Occupancy Pricing</td>\n</tr>\n<tr>\n<td><code>data.room_types[].min_occupancy</code></td>\n<td>Integer</td>\n<td>Minimum occupancy for the room type.</td>\n<td>Required for Occupancy Pricing</td>\n</tr>\n<tr>\n<td><code>data.room_types[].max_occupancy</code></td>\n<td>Integer</td>\n<td>Maximum occupancy for the room type.</td>\n<td>Required for Occupancy Pricing</td>\n</tr>\n<tr>\n<td><code>data.room_types[].number_of_rooms</code></td>\n<td>Integer</td>\n<td>Number of rooms available for the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data.rate_plans</code></td>\n<td>Array of Objects</td>\n<td>List of rate plans associated with the property.</td>\n<td>Required if Rate Plans are supported</td>\n</tr>\n<tr>\n<td><code>data.rate_plans[].rate_plan_code</code></td>\n<td>String</td>\n<td>Immutable Code or ID representing the rate plan.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data.rate_plans[].rate_plan_name</code></td>\n<td>String</td>\n<td>Name of the rate plan.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data.rate_plans[].room_type_code</code></td>\n<td>String</td>\n<td>Code representing the room type the rate plan is associated with.</td>\n<td>Required if Rate Plan is related to Room Type</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":true,"source":{"_postman_id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","name":"🏨 Property ARI Updates","type":"folder"}},"urlObject":{"path":["integrations","api","v1","event",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"9417e9ab-fb04-4c5c-b392-22360be2e848","name":"Room Types Only","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": {\n\t\t\"room_types\": [\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\t\"number_of_rooms\": 11,\n\t\t\t\t\"default_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"min_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"max_occupancy\": 3 // Optional for Occupancy Pricing\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\t\"number_of_rooms\": 10,\n\t\t\t\t\"default_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"min_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"max_occupancy\": 3 // Optional for Occupancy Pricing\n\t\t\t}\n\t\t]\n\t}\n}","options":{"raw":{"language":"json"}}},"url":"https://3ebc3aed-3f9d-4297-a388-ee9375bb7d96.mock.pstmn.io/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"fe5f77bc-097c-48b9-b0ac-68ce2e1e07b8\",\n\t\"property_code\": \"property_code\"\n}"},{"id":"ed9df285-100f-485f-95e0-4c6f8b6eae80","name":"Room Pricing and Rate Plans","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": {\n\t\t\"room_types\": [\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\t\"number_of_rooms\": 11\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\t\"number_of_rooms\": 10\n\t\t\t}\n\t\t],\n\t\t\"rate_plans\": [\n\t\t\t{\n\t\t\t\t\"rate_plan_code\": \"NONREF\",\n\t\t\t\t\"rate_plan_name\": \"Non-Refundable\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"rate_plan_code\": \"BAR\",\n\t\t\t\t\"rate_plan_name\": \"Best Available Rate\"\n\t\t\t}\n\t\t]\n\t}\n}","options":{"raw":{"language":"json"}}},"url":"https://3ebc3aed-3f9d-4297-a388-ee9375bb7d96.mock.pstmn.io/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"fe5f77bc-097c-48b9-b0ac-68ce2e1e07b8\",\n\t\"property_code\": \"property_code\"\n}"},{"id":"ff500df2-153d-42e7-93bd-19d6315589c2","name":"Independent Rate Plans","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": {\n\t\t\"room_types\": [\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\t\"number_of_rooms\": 11,\n\t\t\t\t\"default_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"min_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"max_occupancy\": 3 // Optional for Occupancy Pricing\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\t\"number_of_rooms\": 10,\n\t\t\t\t\"default_occupancy\": 2,\n\t\t\t\t\"min_occupancy\": 1,\n\t\t\t\t\"max_occupancy\": 3\n\t\t\t}\n\t\t],\n\t\t\"rate_plans\": [\n\t\t\t{\n\t\t\t\t\"rate_plan_code\": \"NONREF\",\n\t\t\t\t\"rate_plan_name\": \"Non-Refundable\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"rate_plan_code\": \"BAR\",\n\t\t\t\t\"rate_plan_name\": \"Best Available Rate\"\n\t\t\t}\n\t\t]\n\t}\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"fe5f77bc-097c-48b9-b0ac-68ce2e1e07b8\",\n\t\"property_code\": \"property_code\"\n}"},{"id":"da0c98c0-77f4-4e1c-bf76-5f21221fc215","name":"Dependent Rate Plans","originalRequest":{"method":"POST","header":[{"key":"X-API-Key","value":"<string>"},{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": {\n\t\t\"room_types\": [\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\t\"number_of_rooms\": 11,\n\t\t\t\t\"default_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"min_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"max_occupancy\": 3 // Optional for Occupancy Pricing\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\t\"number_of_rooms\": 10,\n\t\t\t\t\"default_occupancy\": 2,\n\t\t\t\t\"min_occupancy\": 1,\n\t\t\t\t\"max_occupancy\": 3\n\t\t\t}\n\t\t],\n\t\t\"rate_plans\": [\n\t\t\t{\n\t\t\t\t\"rate_plan_code\": \"BAR-SGL\",\n\t\t\t\t\"rate_plan_name\": \"Best Available Rate\",\n\t\t\t\t\"room_type_code\": \"SGL\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"rate_plan_code\": \"BAR-DBL\",\n\t\t\t\t\"rate_plan_name\": \"Best Available Rate\",\n\t\t\t\t\"room_type_code\": \"DBL\"\n\t\t\t}\n\t\t]\n\t}\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"event\": \"<string>\",\n  \"tracking_id\": \"<string>\",\n  \"property_code\": \"<string>\"\n}"},{"id":"cc6b4bc4-3887-450a-88c1-352118bf0e0b","name":"Room only and Occupancy Pricing","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": {\n\t\t\"room_types\": [\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\t\"number_of_rooms\": 10,\n\t\t\t\t\"default_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"min_occupancy\": 2, // Optional for Occupancy Pricing\n\t\t\t\t\"max_occupancy\": 3 // Optional for Occupancy Pricing\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"room_type_code\": \"FAM\",\n\t\t\t\t\"room_type_name\": \"Family Room\",\n\t\t\t\t\"number_of_rooms\": 11,\n\t\t\t\t\"default_occupancy\": 1, // Optional for Occupancy Pricing\n\t\t\t\t\"min_occupancy\": 1, // Optional for Occupancy Pricing\n\t\t\t\t\"max_occupancy\": 1 // Optional for Occupancy Pricing\n\t\t\t},\n\t\t]\n\t}\n}","options":{"raw":{"language":"json"}}},"url":"https://refactoringdevapi.roompricegenie.com/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n\t\"event\": \"inventory.update\",\n\t\"tracking_id\": \"fe5f77bc-097c-48b9-b0ac-68ce2e1e07b8\",\n\t\"property_code\": \"property_code\"\n}"}],"_postman_id":"24f5aeae-218b-4bcf-8511-1dc9248de4d2"},{"name":"Availability Updates","id":"456819ff-20f2-4bb8-9b5c-d04600b4ca2b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-API-Key","value":"partner-api-key"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"availability.update\",\n\t\"tracking_id\": \"09bf825f-7877-4769-92a1-8c94f1cfca89\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-25\",\n\t\t\t\t\t\"end_date\": \"2024-06-30\",\n\t\t\t\t\t\"rooms_left\": 5,\n\t\t\t\t\t\"out_of_order\": 5\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-07-01\",\n\t\t\t\t\t\"end_date\": \"2025-07-01\",\n\t\t\t\t\t\"rooms_left\": 1,\n\t\t\t\t\t\"out_of_order\": 3\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-25\",\n\t\t\t\t\t\"end_date\": \"2024-06-28\",\n\t\t\t\t\t\"rooms_left\": 7,\n\t\t\t\t\t\"out_of_order\": 4\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-29\",\n\t\t\t\t\t\"end_date\": \"2024-06-30\",\n\t\t\t\t\t\"rooms_left\": 7\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-30\",\n\t\t\t\t\t\"end_date\": \"2025-07-02\",\n\t\t\t\t\t\"rooms_left\": 4\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/","description":"<p>Availability is the information about how many rooms are left for sale for a particular date and room type for a property.</p>\n<p>The partner is required to send a initial full push of Availability after initial setup, and a delta update whenever there are changes in availability, as soon as possible.</p>\n<p>RoomPriceGenie considers number of rooms available to sell to calculate Occupancy and propose rates. That way, it is important that you always send the correct number of rooms left for the property, even if a stop-sell is put in place.</p>\n<p>If you support Out-Of-Order (Closed Rooms) it is important that you send the amount of rooms that are out-of-order for that room type and date, even when it's 0.</p>\n<p>Example:</p>\n<ul>\n<li><p>Total Number of Rooms: 14</p>\n</li>\n<li><p>Number of Rooms Sold: 6</p>\n</li>\n<li><p>Number of Rooms Out-of-Order: 2</p>\n</li>\n<li><p>Number of Rooms left: Total - (Sold + OOO) = 6</p>\n</li>\n</ul>\n<p>You should send <code>\"rooms_left\": 6</code> and <code>\"out_of_order\": 2</code></p>\n<p><strong>Important</strong>:</p>\n<ul>\n<li><p>The End Date can be equal or higher than start date. The update will be applied to all dates in the date range.</p>\n</li>\n<li><p>If the integration supports Out of Order, you must send the value for this key, even if it's 0.</p>\n</li>\n<li><p>If you support Stop-Sell, it's very important that you send the real availability to us, instead of 0.</p>\n</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required/Optional</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>String</td>\n<td><code>availability.update availability.response</code></td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>String (UUID4)</td>\n<td>Unique identifier for tracking the event.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td>String</td>\n<td>Code representing the property/hotel.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>Array of Objects</td>\n<td>List of availability updates.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_code</code></td>\n<td>String</td>\n<td>Code representing the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_name</code></td>\n<td>String</td>\n<td>Name of the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar</code></td>\n<td>Array of Objects</td>\n<td>Calendar details for the availability updates.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].start_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>Start date for the availability update.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].end_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>End date for the availability update. Equal or higher than Start Date</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].rooms_left</code></td>\n<td>Integer</td>\n<td>Number of rooms available for sale for the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].out_of_order</code></td>\n<td>Integer</td>\n<td>Number of rooms that are out-of-order for the room type.</td>\n<td>Required, if out of order is supported.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":true,"source":{"_postman_id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","name":"🏨 Property ARI Updates","type":"folder"}},"urlObject":{"path":["integrations","api","v1","event",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"d7139930-c530-48b2-bf5a-2deda21cb7e1","name":"Availability Updates","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"availability.update\",\n\t\"tracking_id\": \"cf8ae2c5-d147-4b71-be50-e8f9a6e46c94\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-25\",\n\t\t\t\t\t\"end_date\": \"2024-06-30\",\n\t\t\t\t\t\"rooms_left\": 7,\n\t\t\t\t\t\"out_of_order\": 2 // Required if Out of Order is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-07-01\",\n\t\t\t\t\t\"end_date\": \"2024-07-01\",\n\t\t\t\t\t\"rooms_left\": 9,\n\t\t\t\t\t\"out_of_order\": 0\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-28\",\n\t\t\t\t\t\"end_date\": \"2024-06-28\",\n\t\t\t\t\t\"rooms_left\": 7,\n\t\t\t\t\t\"out_of_order\": 1\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-29\",\n\t\t\t\t\t\"end_date\": \"2024-06-30\",\n\t\t\t\t\t\"rooms_left\": 7,\n               \"out_of_order\": 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-06-30\",\n\t\t\t\t\t\"end_date\": \"2024-07-02\",\n\t\t\t\t\t\"rooms_left\": 4,\n               \"out_of_order\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://refactoringdevapi.roompricegenie.com/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"availability.update\",\n    \"tracking_id\": \"cf8ae2c5-d147-4b71-be50-e8f9a6e46c94\",\n    \"property_code\": \"property_code\"\n}"}],"_postman_id":"456819ff-20f2-4bb8-9b5c-d04600b4ca2b"},{"name":"Prices Updates","id":"cb2a6b15-8ee3-4a40-ab5d-0b597f72d333","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-API-Key","value":"partner-api-key"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"cef626c1-5db9-4d8d-8500-675b6f24f327\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"default_occupancy\": 2, // Only if Occupancy Pricing is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2025-01-05\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"default_occupancy\": 1, // Only if Occupancy Pricing is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2025-01-05\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/","description":"<p>This endpoint is used by the partner to send changes on Prices to RoomPriceGenie.</p>\n<p>After the initial setup (mapping), you must send a full push of the current prices covering the next 12 or 18 months, starting from the current date.</p>\n<p>For Prices, you can update RoomPriceGenie as:</p>\n<ul>\n<li><p><strong>Room Only Prices:</strong> If you do not support Rate Plans, you don't need to send <code>rate_plan_code</code> and <code>rate_plan_name</code></p>\n</li>\n<li><p><strong>Room and Rate Plan Prices</strong>: If you support Rate Plans, you must send us the prices for all rate plans that were provided in your <code>inventory.update</code> message.</p>\n</li>\n<li><p><strong>Occupancy Based Pricing</strong>: If you support it, you should push the Rates for all occupancy levels that were provided in your <code>inventory.update</code> message, using the <strong>prices</strong> dictionary.</p>\n</li>\n</ul>\n<p><strong>Important</strong>:</p>\n<ul>\n<li><p><strong>Do not send decimals</strong> with the rates. Round it to the closest integer value.</p>\n</li>\n<li><p>Do not pair Availability updates with Rates update. They should be sent separately, when a change occurs to each.</p>\n</li>\n<li><p>Please make sure to <strong>always use Date Ranges</strong> whenever possible (e.g. a rate is the same from day x to y). In other words, do not send one object for each day, if not necessary.</p>\n</li>\n<li><p><strong>Do not</strong> send the rates back to RoomPriceGenie when you receive an update from RoomPriceGenie.</p>\n</li>\n<li><p>The End Date can be equal or higher than start date. The update will be <strong>applied to all dates</strong> in the date range.</p>\n</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>String</td>\n<td><code>rates.update rates.response</code></td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>String (UUID4)</td>\n<td>Unique identifier for tracking the event.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td>String</td>\n<td>Code representing the property.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>Array of Objects</td>\n<td>List of rates to be updated</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_code</code></td>\n<td>String</td>\n<td>Code representing the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_name</code></td>\n<td>String</td>\n<td>Name of the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_code</code></td>\n<td>String</td>\n<td>Code representing the rate plan.</td>\n<td>Required only when Rate Plan is supported, otherwise do not send it.</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_name</code></td>\n<td>String</td>\n<td>Name of the rate plan.</td>\n<td>Required only when Rate Plan is supported, otherwise do not send it.</td>\n</tr>\n<tr>\n<td><code>data[].default_occupancy</code></td>\n<td>Integer</td>\n<td>Default occupancy for the room type.</td>\n<td>Required only if Occupancy Pricing is supported, otherwise do not send it.</td>\n</tr>\n<tr>\n<td><code>data[].calendar</code></td>\n<td>Array of Objects</td>\n<td>Calendar details for the rate and restrictions.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].start_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>Start date for the rate or restriction.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].end_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>End date equal or higher than Start Date.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].price</code></td>\n<td>Integer</td>\n<td>Price for the room type. <strong>Decimals are not accepted</strong></td>\n<td>Required if Occupancy Pricing is <strong>NOT</strong> supported</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].prices</code></td>\n<td>Array of Objects</td>\n<td></td>\n<td>Required only when Occupancy Pricing is supported, otherwise do not send it.</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].prices[].occupancy</code></td>\n<td>Integer</td>\n<td>The number of guests for the given price.</td>\n<td>Required only when Occupancy Pricing is supported, otherwise do not send it.</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].prices[].price</code></td>\n<td>Integer</td>\n<td>The price for the room based on the specified occupancy.  <br /><strong>Decimals are not accepted</strong></td>\n<td>Required only when Occupancy Pricing is supported, otherwise do not send it.</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":true,"source":{"_postman_id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","name":"🏨 Property ARI Updates","type":"folder"}},"urlObject":{"path":["integrations","api","v1","event",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"8a80df61-a1c4-4a03-a29f-bd9f4905b760","name":"Rates (Room Based)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-05\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://refactoringdevapi.roompricegenie.com/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"},{"id":"57236b07-8237-4a23-afd1-3317985b56d8","name":"Rates (Occupancy)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-05\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 150\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-05\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 150\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"FAM\",\n\t\t\t\"room_type_name\": \"Family Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 150\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 3,\n\t\t\t\t\t\t\t\"price\": 200\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 4,\n\t\t\t\t\t\t\t\"price\": 250\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-05\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 150\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 3,\n\t\t\t\t\t\t\t\"price\": 200\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 4,\n\t\t\t\t\t\t\t\"price\": 250\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://refactoringdevapi.roompricegenie.com/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"},{"id":"c23fde96-c698-43fa-bf8e-1f8a2fd643bd","name":"Rates (Mixed)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n   \"event\": \"rates.update\",\n   \"tracking_id\": \"UUID4\",\n   \"property_code\": \"property_code\",\n   \"data\": [\n      {\n         \"room_type_code\": \"DBL\",\n         \"room_type_name\": \"Double Room\",\n         \"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n         \"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n         \"calendar\": [\n            {\n               \"start_date\": \"2024-01-01\",\n               \"end_date\": \"2024-01-01\",\n               \"prices\": [\n                  {\n                     \"occupancy\": 1,\n                     \"price\": 100\n                  },\n                  {\n                     \"occupancy\": 2,\n                     \"price\": 150\n                  }\n               ]\n            },\n            {\n               \"start_date\": \"2024-01-02\",\n               \"end_date\": \"2024-01-05\",\n               \"prices\": [\n                  {\n                     \"occupancy\": 1,\n                     \"price\": 100\n                  },\n                  {\n                     \"occupancy\": 2,\n                     \"price\": 150\n                  }\n               ]\n            }\n         ]\n      },\n      {\n         \"room_type_code\": \"FAM\",\n         \"room_type_name\": \"Family Room\",\n         \"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n         \"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n         \"calendar\": [\n            {\n               \"start_date\": \"2024-01-01\",\n               \"end_date\": \"2024-01-01\",\n               \"prices\": [\n                  {\n                     \"occupancy\": 1,\n                     \"price\": 100\n                  }\n               ]\n            },\n            {\n               \"start_date\": \"2024-01-02\",\n               \"end_date\": \"2024-01-05\",\n               \"prices\": [\n                  {\n                     \"occupancy\": 1,\n                     \"price\": 120\n                  }\n               ]\n            }\n         ]\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"https://refactoringdevapi.roompricegenie.com/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"}],"_postman_id":"cb2a6b15-8ee3-4a40-ab5d-0b597f72d333"}],"id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"593f47b4-6012-48d5-9e31-55686bc6f23b","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"c07c50fc-d875-43a8-9217-d7a7d7c1c1df","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"bef01d13-bd0d-445f-b58d-d6e34d9e8d26","description":""},{"name":"🧞‍♂️ RoomPriceGenie Price Updates","item":[{"name":"🧞‍♂️ Upload Rates","id":"62e5ec79-7ab4-4d93-ad78-f7afc96dfac7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"X-API-Key","value":"{{partner_api_key}}"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"304dce5f-8425-4272-b3ba-d74e810f2bf5\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Required if Rate Plans is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Required if Rate Plans is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 100 // Example for Room Based only\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-07\",\n\t\t\t\t\t\"prices\": [\t\t\t\t// Occupancy Based Pricing example\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 120\n\t\t\t\t\t\t}, \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 150\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"NONREF\",\n\t\t\t\"rate_plan_name\": \"Non Refundable\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-07\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 120\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint","description":"<p>RoomPriceGenie will send this payload to the partner whenever there are changes in Prices.</p>\n<p>The partner must validate the Bearer Token using JWT to ensure the authenticity of the request.</p>\n<p>In the same payload, we can push updates for different room types and/or different rate plans. Also for different occupancies. Please check the different examples on the right side.</p>\n<p>The partner <strong>must respond with a</strong> 200 OK status code to acknowledge the successful processing of the request. The response <strong>must include the same</strong> tracking_id from the request in the response body to confirm the correlation between the request and the response.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>String</td>\n<td><code>rates.update</code></td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>String (UUID4)</td>\n<td>Unique identifier for tracking the event.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td>String</td>\n<td>Code representing the property.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>Array of Objects</td>\n<td>List of rates updates.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_code</code></td>\n<td>String</td>\n<td>Code representing the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_name</code></td>\n<td>String</td>\n<td>Name of the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_code</code></td>\n<td>String</td>\n<td>Code representing the rate plan.</td>\n<td>Required (If supported)</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_name</code></td>\n<td>String</td>\n<td>Name of the rate plan.</td>\n<td>Required (If supported)</td>\n</tr>\n<tr>\n<td><code>data[].calendar</code></td>\n<td>Array of Objects</td>\n<td>Calendar details for the rates.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].start_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>Start date for the rate.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].end_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>End date for the rate (equal or higher than <code>start_date</code>).</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].price</code></td>\n<td>Integer</td>\n<td>Price for the room type.</td>\n<td>Required (if Occupancy-based is NOT supported)</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].prices</code></td>\n<td>Array of Objects</td>\n<td></td>\n<td>Required (if Occupancy-based is supported)</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].prices[].occupancy</code></td>\n<td>Integer</td>\n<td>The number of guests for the given price.</td>\n<td>Required (if Occupancy-based is supported)</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].prices[].price</code></td>\n<td>Integer</td>\n<td>The price for the room based on the specified occupancy.</td>\n<td>Required (if Occupancy-based is supported)</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"protocol":"https","path":["endpoint"],"host":["partnerdomain","com"],"query":[],"variable":[]}},"response":[{"id":"94e1bb37-0c14-41fb-8cee-4362599b0379","name":"RPG Price Update (Room Type Based)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 90\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"},{"id":"570c35e7-f855-41a1-80a8-5c90941ea225","name":"RPG Price Update (Occupancy Pricing)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Required if Rate Plans is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Required if Rate Plans is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 150\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 150\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 2,\n\t\t\t\t\t\t\t\"price\": 180\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\",\n\t\t\t\"rate_plan_name\": \"Best Available Rate\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"prices\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"occupancy\": 1,\n\t\t\t\t\t\t\t\"price\": 100\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"},{"id":"88d70538-b45c-4a40-a83b-b63c386e872c","name":"RPG Price Update (Independent Rate Plan)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\",\n\t\t\t\"rate_plan_name\": \"Best Available Rate\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\",\n\t\t\t\"rate_plan_name\": \"Best Available Rate\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 90\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"},{"id":"fbdf7daa-94f9-4347-a159-c0129e1692d8","name":"Price Update (Dependent Rate Plans)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR-DBL\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR-SGL\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 12 Jul 2024 11:22:10 GMT"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"150"},{"key":"Connection","value":"keep-alive"},{"key":"x-srv-trace","value":"v=1;t=ae193746991e46b6"},{"key":"x-srv-span","value":"v=1;s=05dd89e3e7c57465"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"X-RateLimit-Limit","value":"120"},{"key":"X-RateLimit-Remaining","value":"118"},{"key":"X-RateLimit-Reset","value":"1720783386"},{"key":"ETag","value":"W/\"96-S/5iQ2y1qqIInh5BwoPc+chvDJU\""},{"key":"Vary","value":"Accept-Encoding"}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"property_code\"\n}"},{"id":"b3035675-73fb-4a68-ace2-46e23c882874","name":"Price Update (Derived Rate Plans)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"rates.update\",\n\t\"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n\t\"property_code\": \"TEST_ACCOUNT\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"NONREF\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Non Refundable\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 90\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 100\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 100\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"NONREF\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Non Refundable\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"price\": 90\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"price\": 90\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 12 Jul 2024 11:22:10 GMT"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"150"},{"key":"Connection","value":"keep-alive"},{"key":"x-srv-trace","value":"v=1;t=ae193746991e46b6"},{"key":"x-srv-span","value":"v=1;s=05dd89e3e7c57465"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"X-RateLimit-Limit","value":"120"},{"key":"X-RateLimit-Remaining","value":"118"},{"key":"X-RateLimit-Reset","value":"1720783386"},{"key":"ETag","value":"W/\"96-S/5iQ2y1qqIInh5BwoPc+chvDJU\""},{"key":"Vary","value":"Accept-Encoding"}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"rates.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"}],"_postman_id":"62e5ec79-7ab4-4d93-ad78-f7afc96dfac7"}],"id":"2e913ff4-9afa-4f11-9736-9551023f27a4","description":"<p>RoomPriceGenie uses the data provided by the partner to calculate and propose new rates.</p>\n<p>To receive rate and restriction updates, as well as any other data from RoomPriceGenie, the partner must provide a <strong>single, fixed endpoint URL</strong> where updates will be sent via HTTP POST requests. This URL will remain the same for all accounts connected to RoomPriceGenie and for all types of data. To minimize data size, only relevant updates will be transmitted.</p>\n","auth":{"type":"noauth","isInherited":false},"event":[{"listen":"prerequest","script":{"id":"262d5d51-12ac-4a44-ab2a-6743f41c37aa","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"f6ac66e5-84d0-44f3-90ef-c2ade0d06f13","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"2e913ff4-9afa-4f11-9736-9551023f27a4"}],"id":"42dd50f7-f77f-4509-9e2f-a476204e47b7","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"d5ce4bcf-d931-4319-ab11-dc23152b9c1f","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"91835f6c-4ab7-468e-9a25-5b516dde83e3","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"42dd50f7-f77f-4509-9e2f-a476204e47b7","description":""},{"name":"🌙 Min Stay Feature","item":[{"name":"Restrictions Update (from partner)","id":"3eb53b23-58bd-411f-a409-e3e843b2837a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":false},"method":"POST","header":[{"key":"X-API-Key","value":"partner-api-key"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"restrictions.update\",\n\t\"tracking_id\": \"114cb8ce-df20-4d8f-92d1-e4411112ed16\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"min_stay_through\": 2 // If MinStay Stay Through is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2025-01-05\",\n\t\t\t\t\t\"min_stay_through\": 1, // If MinStay Stay Through is supported\n\t\t\t\t\t\"min_stay_arrival\": 2 // If MinStay Arrival is supported\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"min_stay_arrival\": 2 // If MinStay Arrival is supported\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/","description":"<p>This endpoint allows partners to send Minimum Stay restriction data to RoomPriceGenie. It is structurally very similar to the rates.update payload, but with some key differences:</p>\n<ul>\n<li><p>The event name is <strong><code>restrictions.update</code></strong>.</p>\n</li>\n<li><p>Instead of pricing parameters (<code>price</code> and <code>prices[]</code>), it uses <strong><code>min_stay_through</code></strong> (for Stay-Through minimum stay) and <strong><code>min_stay_arrival</code></strong> (for arrival-based minimum stay).</p>\n</li>\n</ul>\n<p>During initial setup, if Minimum Stay restrictions are configured in the PMS, you should send us the data for <strong>at least one year in advance</strong>.</p>\n<p>Unlike availability and prices—where a value must be sent for <strong>every date</strong>—for Minimum Stay, you only need to send values for the dates where a restriction is actually configured.</p>\n<p>If there are no Minimum Stay set in the PMS (or set as 1), this data is not required.</p>\n<p>Subsequently, you should send any changes whenever they happen.</p>\n<p><strong>🧠 Important Notes:</strong></p>\n<ul>\n<li><p>If your PMS does <strong>not support</strong> minimum stay restrictions, this endpoint is not required.</p>\n</li>\n<li><p>When we receive a value of <strong>0 or 1</strong>, we interpret it as if <strong>no restriction is set</strong> for that date.</p>\n</li>\n<li><p>Please make sure to <strong>always use Date Ranges</strong> whenever possible (e.g. a restriction is the same from day x to y). In other words, do not send one object for each day, if not necessary.</p>\n</li>\n<li><p><strong>Do not</strong> send the restrictions back when you receive an update from RoomPriceGenie.</p>\n</li>\n<li><p>The End Date can be equal or higher than start date. The update will be <strong>applied to all dates</strong> in the date range.</p>\n</li>\n</ul>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>String</td>\n<td><code>restrictions.update restrictions.response</code></td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>String (UUID4)</td>\n<td>Unique identifier for tracking the event.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td>String</td>\n<td>Code representing the property.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>Array of Objects</td>\n<td>List of rates to be updated</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_code</code></td>\n<td>String</td>\n<td>Code representing the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_name</code></td>\n<td>String</td>\n<td>Name of the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_code</code></td>\n<td>String</td>\n<td>Code representing the rate plan.</td>\n<td>Required only when Rate Plan is supported, otherwise do not send it.</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_name</code></td>\n<td>String</td>\n<td>Name of the rate plan.</td>\n<td>Required only when Rate Plan is supported, otherwise do not send it.</td>\n</tr>\n<tr>\n<td><code>data[].calendar</code></td>\n<td>Array of Objects</td>\n<td>Calendar details for the rate and restrictions.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].start_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>Start date for the rate or restriction.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].end_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>End date equal or higher than Start Date.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].min_stay_through</code></td>\n<td>Integer</td>\n<td>Minimum stay restriction (Stay-Through based).  <br />Treated as unset if 0 or 1.</td>\n<td>Required only when supported</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].min_stay_arrival</code></td>\n<td>Integer</td>\n<td>Minimum stay restriction (Arrival-based).  <br />Treated as unset if 0 or 1.</td>\n<td>Required only when supported</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["integrations","api","v1","event",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"f4b542e0-dd7a-433f-ae4d-67c30af3e59c","name":"Restrictions Update","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"X-API-Key","value":"partner-api-key","type":"text"},{"key":"Authorization","value":"Bearer token","type":"text"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"restrictions.update\",\n\t\"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n\t\"property_code\": \"123\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"min_stay_through\": 2 // If MinStay Stay Through is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2025-01-05\",\n\t\t\t\t\t\"min_stay_through\": 1, // If MinStay Stay Through is supported\n\t\t\t\t\t\"min_stay_arrival\": 2 // If MinStay Arrival is supported\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\",\n\t\t\t\t\t\"min_stay_arrival\": 2 // If MinStay Arrival is supported\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"restrictions.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"123\"\n}"}],"_postman_id":"3eb53b23-58bd-411f-a409-e3e843b2837a"},{"name":"Upload Restrictions","id":"2997d50f-3e9f-4de7-9e53-b45a6796edd6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"X-API-Key","value":"partner-api-key","type":"text"},{"key":"Authorization","value":"Bearer token","type":"text"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"restrictions.update\",\n\t\"tracking_id\": \"5c227972-cd5f-457f-8731-68063ad001c1\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Required if Rate Plans is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Required if Rate Plans is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_arrival\": 1 // Optional\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-07\",\n\t\t\t\t\t\"min_stay_arrival\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"NONREF\",\n\t\t\t\"rate_plan_name\": \"Non Refundable\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-01\",\n\t\t\t\t\t\"end_date\": \"2024-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_arrival\": 1 // Optional\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2024-01-02\",\n\t\t\t\t\t\"end_date\": \"2024-01-07\",\n\t\t\t\t\t\"min_stay_arrival\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint","description":"<p>RoomPriceGenie will send this payload to the partner whenever there are changes in Restrictions. Currently, we support Minimum Stay Arrival or Stay-Through based.</p>\n<p>The partner <strong>must respond with a</strong> 200 OK status code to acknowledge the successful processing of the request. The response <strong>must include the same</strong> tracking_id from the request in the response body to confirm the correlation between the request and the response.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required/Optional</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>String</td>\n<td><code>restrictions.update</code></td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>String (UUID4)</td>\n<td>Unique identifier for tracking the event.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td>String</td>\n<td>Code representing the property.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data</code></td>\n<td>Array of Objects</td>\n<td>List of restrictions updates.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_code</code></td>\n<td>String</td>\n<td>Code representing the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].room_type_name</code></td>\n<td>String</td>\n<td>Name of the room type.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_code</code></td>\n<td>String</td>\n<td>Code representing the rate plan.</td>\n<td>Required (If supported)</td>\n</tr>\n<tr>\n<td><code>data[].rate_plan_name</code></td>\n<td>String</td>\n<td>Name of the rate plan.</td>\n<td>Required (If supported)</td>\n</tr>\n<tr>\n<td><code>data[].calendar</code></td>\n<td>Array of Objects</td>\n<td>Calendar details for the restrictions.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].start_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>Start date for the rate or restriction.</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].end_date</code></td>\n<td>String (YYYY-MM-DD)</td>\n<td>End date for the restriction (equal or higher than <code>start_date</code>).</td>\n<td>Required</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].min_stay_arrival</code></td>\n<td>Integer</td>\n<td>Minimum stay for the room type</td>\n<td>Required if Arrival-based</td>\n</tr>\n<tr>\n<td><code>data[].calendar[].min_stay_through</code></td>\n<td>Integer</td>\n<td>Minimum stay for the room type.</td>\n<td>Required if Stay-Through-based</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"protocol":"https","path":["endpoint"],"host":["partnerdomain","com"],"query":[],"variable":[]}},"response":[{"id":"d5f50f3f-07e3-4119-b5c3-e44920a99558","name":"RPG Restrictions Update (Room Type Based)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"restrictions.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_arrival\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_arrival\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_arrival\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_arrival\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"restrictions.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"},{"id":"20d4c808-2121-4400-93a3-fe14f449eafc","name":"RPG Restrictions Update (Single Rate Plan)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"restrictions.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\",\n\t\t\t\"rate_plan_name\": \"Best Available Rate\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_arrival\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_arrival\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\",\n\t\t\t\"rate_plan_name\": \"Best Available Rate\",\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_arrival\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_arrival\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":{"content":"","type":"text/plain"}}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"restrictions.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"},{"id":"eab658c4-5a68-4833-acdf-16e2753e85bb","name":"RPG Restrictions Update (Multiple Rate Plans)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"X-API-Key","value":"partner-api-key"},{"key":"Authorization","value":"Bearer token"}],"body":{"mode":"raw","raw":"{\n\t\"event\": \"restrictions.update\",\n\t\"tracking_id\": \"UUID4\",\n\t\"property_code\": \"property_code\",\n\t\"data\": [\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_through\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_through\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"DBL\",\n\t\t\t\"room_type_name\": \"Double Room\",\n\t\t\t\"rate_plan_code\": \"NONREF\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Non Refundable\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_through\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_through\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"BAR\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Best Available Rate\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_through\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_through\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"room_type_code\": \"SGL\",\n\t\t\t\"room_type_name\": \"Single Room\",\n\t\t\t\"rate_plan_code\": \"NONREF\", // Only when Rate Plan is supported\n\t\t\t\"rate_plan_name\": \"Non Refundable\", // Only when Rate Plan is supported\n\t\t\t\"calendar\": [\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-01\",\n\t\t\t\t\t\"end_date\": \"2020-01-01\", // Equal or higher than start_date\n\t\t\t\t\t\"min_stay_through\": 1 // Optional if Stay Through Based Min Stay is supported\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"start_date\": \"2020-01-02\",\n\t\t\t\t\t\"end_date\": \"2020-01-07\",\n\t\t\t\t\t\"min_stay_through\": 1\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}","options":{"raw":{"language":"json"}}},"url":"https://partnerdomain.com/endpoint"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 12 Jul 2024 11:22:10 GMT"},{"key":"Content-Type","value":"application/json; charset=utf-8"},{"key":"Content-Length","value":"150"},{"key":"Connection","value":"keep-alive"},{"key":"x-srv-trace","value":"v=1;t=ae193746991e46b6"},{"key":"x-srv-span","value":"v=1;s=05dd89e3e7c57465"},{"key":"Access-Control-Allow-Origin","value":"*"},{"key":"X-RateLimit-Limit","value":"120"},{"key":"X-RateLimit-Remaining","value":"118"},{"key":"X-RateLimit-Reset","value":"1720783386"},{"key":"ETag","value":"W/\"96-S/5iQ2y1qqIInh5BwoPc+chvDJU\""},{"key":"Vary","value":"Accept-Encoding"}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"restrictions.update\",\n    \"tracking_id\": \"3cc216d5-3a7a-4d3b-acc8-7af2ec0019ae\",\n    \"property_code\": \"TEST_ACCOUNT\"\n}"}],"_postman_id":"2997d50f-3e9f-4de7-9e53-b45a6796edd6"}],"id":"f9a8e99a-e2cd-4be3-b054-818925794e3d","description":"<p>RoomPriceGenie supports both Arrival-based and Stay-through-based minimum stay restrictions. Please tell us which option you support: one of the types or both.</p>\n<ul>\n<li><p>Arrival-based means the minimum stay restriction applies only to guests starting their stay on that date.</p>\n</li>\n<li><p>Stay-through-based means the minimum stay applies to any night the stay overlaps, even if the guest arrives earlier.</p>\n</li>\n</ul>\n<p>If you support only one type, use the matching key in the payload when sending and receiving minimum stay values. If you support both, you may send both values.</p>\n<p>When both are supported, RoomPriceGenie will let the user choose which type they want to use, and we will send updates using that selected key.</p>\n","_postman_id":"f9a8e99a-e2cd-4be3-b054-818925794e3d"},{"name":"📊 Reporting Integration","item":[{"name":"Reservations Update","id":"dde4483d-1511-48ec-8885-f8fc9f1f8057","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-API-Key","value":"partner-api-key","type":"text"}],"body":{"mode":"raw","raw":"{\n   \"event\": \"reservation.update\",\n   \"tracking_id\": \"{{UUID}}\",\n   \"property_code\": \"{{property_code}}\",\n   \"partner_property_code\": \"{{partner_account_id}}\",\n   \"data\": [\n      {\n         \"reservation_id\": \"RES510\",\n         \"group_reservation_id\": \"GRP510\",\n         \"shared_reservation_id\": \"SHARE123\",\n         \"status\": \"confirmed\",\n         \"arrival_date\": \"2025-11-06\",\n         \"departure_date\": \"2025-11-08\",\n         \"guest_country_code\": \"NL\",\n         \"guest_company_name\": \"ACME Unlimited\",\n         \"guest_company_id\": \"CO001\",\n         \"source_name\": \"OTA\",\n         \"source_id\": \"OTA001\",\n         \"channel_name\": \"Booking.com\",\n         \"channel_id\": \"CH001\",\n         \"travel_agent_name\": \"Genie Travels\",\n         \"travel_agent_id\": \"TA001\",\n         \"created_at\": \"2025-10-10T09:00:00Z\",\n         \"updated_at\": \"2025-11-06T12:30:00Z\",\n         \"cancelled_at\": \"2025-11-06T12:30:00Z\",\n         \"stay_dates\": [\n            {\n               \"date\": \"2025-11-06\",\n               \"room_reservation_id\": \"RES510-A\",\n               \"room_type_id\": \"DBL\",\n               \"room_type_name\": \"Double Room\",\n               \"room_number\": \"101\",\n               \"originally_booked_room_type_id\": \"SGL\",\n               \"originally_booked_room_type_name\": \"Single Room\",\n               \"is_virtual_room\": false,\n               \"rate_plan_id\": \"BAR\",\n               \"rate_plan_name\": \"Bar Rate\",\n               \"market_segment_id\": \"MS001\",\n               \"market_segment_name\": \"leisure\",\n               \"number_of_adults\": 1,\n               \"number_of_children\": 0,\n               \"rate_gross_amount\": \"95.0\",\n               \"rate_net_amount\": \"80.75\",\n               \"room_revenue_gross_amount\": \"190.0\",\n               \"room_revenue_net_amount\": \"161.5\",\n               \"fnb_gross_amount\": \"45.0\",\n               \"fnb_net_amount\": \"38.25\",\n               \"currency_code\": \"EUR\"\n            },\n            {\n               \"date\": \"2025-11-07\",\n               \"room_reservation_id\": \"RES510-A\",\n               \"room_type_id\": \"DBL\",\n               \"room_type_name\": \"Double Room\",\n               \"room_number\": \"101\",\n               \"originally_booked_roomtype_id\": \"SGL\",\n               \"originally_booked_roomtype_name\": \"Single Room\",\n               \"is_virtual_room\": false,\n               \"rate_plan_id\": \"BAR\",\n               \"rate_plan_name\": \"Bar Rate\",\n               \"market_segment_id\": \"MS002\",\n               \"market_segment_name\": \"business\",\n               \"number_of_adults\": 1,\n               \"rate_gross_amount\": \"100.0\",\n               \"rate_net_amount\": \"85.0\",\n               \"room_revenue_gross_amount\": \"200.0\",\n               \"room_revenue_net_amount\": \"170.0\",\n               \"other_gross_amount\": \"45.0\",\n               \"other_net_amount\": \"38.25\",\n               \"currency_code\": \"GBP\"\n            }\n         ]\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/","description":"<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>event</code></td>\n<td>string</td>\n<td><code>reservation.update</code></td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>tracking_id</code></td>\n<td>string (UUID)</td>\n<td>Unique identifier for tracking the event</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td>string</td>\n<td>Code representing the property's account on RoomPriceGenie.  <br />For non-Open API integrations, this could be the same as <code>partner_property_code</code></td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>partner_property_code</code></td>\n<td>string</td>\n<td>Code (ID) representing the property's account on the partner side.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>data</td>\n<td>array</td>\n<td>List of reservation objects</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"🛏️-reservation-object\">🛏️ Reservation Object</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>reservation_id</code></td>\n<td>string</td>\n<td>Public-facing reservation code</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>group_reservation_id</code></td>\n<td>string</td>\n<td>ID of the group this reservation belongs to</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>shared_reservation_id</code></td>\n<td>string</td>\n<td>In case the reservation is part of a shared reservation, the ID of the share from the PMS</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>enum</td>\n<td>Reservation status: <code>waiting_list</code>, <code>provisional</code>, <code>confirmed</code>, <code>cancelled</code>, <code>no_show</code>, <code>checked_in</code>, <code>checked_out</code></td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>arrival_date</code></td>\n<td>string (YYYY-MM-DD)</td>\n<td>Check-in date</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>departure_date</code></td>\n<td>string (YYYY-MM-DD)</td>\n<td>Check-out date</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>guest_country_code</code></td>\n<td>string</td>\n<td>Guest Country of Residence.  <br />ISO 3166-1 alpha-2 code</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>guest_company_name</code></td>\n<td>string</td>\n<td>Guest's Company name</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>guest_company_id</code></td>\n<td>string</td>\n<td>Internal company identifier</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>source_name</code></td>\n<td>string</td>\n<td>Booking source: <code>OTA</code>, <code>phone</code>, <code>email</code>, etc.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>source_id</code></td>\n<td>string</td>\n<td>Partner's Internal source ID  <br />Required if <code>source_name</code> is provided</td>\n<td>❓</td>\n</tr>\n<tr>\n<td><code>channel_name</code></td>\n<td>string</td>\n<td>Channel name like <code>Booking.com</code>, <code>Expedia</code>, etc.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>channel_id</code></td>\n<td>string</td>\n<td>Partner's Internal Channel ID.  <br />Required if <code>channel_name</code> is provided</td>\n<td>❓</td>\n</tr>\n<tr>\n<td><code>travel_agent_name</code></td>\n<td>string</td>\n<td>Name of travel agent</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>travel_agent_id</code></td>\n<td>string</td>\n<td>Partner's Internal travel agent ID. Required if <code>travel_agent_name</code> is provided</td>\n<td>❓</td>\n</tr>\n<tr>\n<td><code>created_at</code></td>\n<td>string (UTC ISO-8601)</td>\n<td>When the reservation was created</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>updated_at</code></td>\n<td>string (UTC ISO-8601)</td>\n<td>When the reservation was last modified</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>cancelled_at</code></td>\n<td>string (UTC ISO-8601)</td>\n<td>Required only if status is <code>cancelled</code></td>\n<td>❓</td>\n</tr>\n<tr>\n<td>stay_dates</td>\n<td>array</td>\n<td>List of stay dates objects</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"🏨-stay-dates\">🏨 Stay Dates</h2>\n<blockquote>\n<p>Nightly-level rates data. Sorted by stay date (chronological order). Should only include dates that are equal or greater than arrival_date and before departure_date. </p>\n</blockquote>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>date</code></td>\n<td>string</td>\n<td>Date of stay</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>room_reservation_id</code></td>\n<td>string</td>\n<td>In case of multi-room reservations, or in case the PMS applies an ID to each room which is different to the main reservation ID, the UID of the room's reservation on the date</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>room_type_id</code></td>\n<td>string</td>\n<td>Room type ID</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>room_type_name</code></td>\n<td>string</td>\n<td>Room type name</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>room_number</code></td>\n<td>string</td>\n<td>Assigned Room number/name</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>originally_booked_room_type_id</code></td>\n<td>string</td>\n<td>Room type ID, if available</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>originally_booked_room_type_name</code></td>\n<td>string</td>\n<td>Room type name, if available. Required if <code>originally_booked_roomtype_id</code> is provided</td>\n<td>❓</td>\n</tr>\n<tr>\n<td><code>is_virtual_room</code></td>\n<td>boolean</td>\n<td>Default is <code>false</code></td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>rate_plan_id</code></td>\n<td>string</td>\n<td>Rate plan ID</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>rate_plan_name</code></td>\n<td>string</td>\n<td>Rate plan name</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>market_segment_id</code></td>\n<td>string</td>\n<td>Market segment ID</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>market_segment_name</code></td>\n<td>string</td>\n<td>Required if <code>market_segment_id</code> is provided</td>\n<td>❓</td>\n</tr>\n<tr>\n<td><code>number_of_adults</code></td>\n<td>int</td>\n<td>Total number of adults for this room type and date</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>number_of_children</code></td>\n<td>int</td>\n<td>Total number of children for this room type and date</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>rate_gross_amount</code></td>\n<td>string</td>\n<td>The standard/normal gross rate you charge for the room (the “rack” rate before any discounts), per room for the given room type and date. Use period (\".\") to separate decimals.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>rate_net_amount</code></td>\n<td>string</td>\n<td>The standard/normal net rate you charge for the room (the “rack” rate before any discounts, net of taxes/fees per your net definition), per room for the given room type and date. Use period (\".\") to separate decimals.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>room_revenue_gross_amount</code></td>\n<td>string</td>\n<td>Room gross revenue excluding other revenue and food &amp; beverage. Use period (\".\") to separate decimals.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>room_revenue_net_amount</code></td>\n<td>string</td>\n<td>Room net revenue excluding other revenue and food &amp; beverage. Use period (\".\") to separate decimals.</td>\n<td>✅</td>\n</tr>\n<tr>\n<td><code>fnb_gross_amount</code></td>\n<td>string</td>\n<td>Food &amp; beverage gross revenue (total per room type and date). Use period (\".\") to separate decimals.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>fnb_net_amount</code></td>\n<td>string</td>\n<td>Food &amp; beverage net revenue. Use period (\".\") to separate decimals.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>other_gross_amount</code></td>\n<td>string</td>\n<td>Other gross revenue (e.g., tours, services). Use period (\".\") to separate decimals.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>other_net_amount</code></td>\n<td>string</td>\n<td>Other net revenue. Use period (\".\") to separate decimals.</td>\n<td>❌</td>\n</tr>\n<tr>\n<td><code>currency_code</code></td>\n<td>string</td>\n<td>ISO 4217 currency code</td>\n<td>✅</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":true,"source":{"_postman_id":"3c10b740-5d96-44e4-9d38-21d8ac83657c","id":"3c10b740-5d96-44e4-9d38-21d8ac83657c","name":"📊 Reporting Integration","type":"folder"}},"urlObject":{"path":["integrations","api","v1","event",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"267f9d1a-6d0c-404e-a405-2a1837a5f8ab","name":"Reservations Update","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"X-API-Key","value":"partner-api-key","type":"text"},{"key":"Authorization","value":"Bearer token","type":"text"}],"body":{"mode":"raw","raw":"{\n   \"event\": \"reservation.update\",\n   \"tracking_id\": \"aeadfd86-f4ef-4344-9c36-ea8ad5f32d66\",\n   \"property_code\": \"986\", // RoomPriceGenie Account ID as provided for the integration connection.\n   \"partner_property_code\": \"Hotel123\", // The account ID on the partner side.\n   \"data\": [\n      {\n         \"reservation_id\": \"RES510\",\n         \"group_reservation_id\": \"GRP510\",\n         \"shared_reservation_id\": \"SHARE123\",\n         \"status\": \"confirmed\",\n         \"arrival_date\": \"2025-11-06\",\n         \"departure_date\": \"2025-11-08\",\n         \"guest_country_code\": \"NL\",\n         \"guest_company_name\": \"ACME Unlimited\",\n         \"guest_company_id\": \"CO001\",\n         \"source_name\": \"OTA\",\n         \"source_id\": \"OTA001\",\n         \"channel_name\": \"Booking.com\",\n         \"channel_id\": \"CH001\",\n         \"travel_agent_name\": \"Genie Travels\",\n         \"travel_agent_id\": \"TA001\",\n         \"created_at\": \"2025-10-10T09:00:00Z\",\n         \"updated_at\": \"2025-11-06T12:30:00Z\",\n         \"cancelled_at\": \"2025-11-06T12:30:00Z\", // Required if status = canceled. Omit otherwise.\n         \"stay_dates\": [\n            {\n               \"date\": \"2025-11-06\",\n               \"room_reservation_id\": \"RES510-A\",\n               \"room_type_id\": \"DBL\",\n               \"room_type_name\": \"Double Room\",\n               \"room_number\": \"101\",\n               \"originally_booked_room_type_id\": \"SGL\",\n               \"originally_booked_room_type_name\": \"Single Room\",\n               \"is_virtual_room\": false,\n               \"rate_plan_id\": \"BAR\",\n               \"rate_plan_name\": \"Bar Rate\",\n               \"market_segment_id\": \"MS001\",\n               \"market_segment_name\": \"leisure\",\n               \"number_of_adults\": 1,\n               \"number_of_children\": 0,\n               \"rate_gross_amount\": \"95.0\",\n               \"rate_net_amount\": \"80.75\",\n               \"room_revenue_gross_amount\": \"190.0\",\n               \"room_revenue_net_amount\": \"161.5\",\n               \"fnb_gross_amount\": \"45.0\",\n               \"fnb_net_amount\": \"38.25\",\n               \"currency_code\": \"EUR\"\n            },\n            {\n               \"date\": \"2025-11-07\",\n               \"room_reservation_id\": \"RES510-A\",\n               \"room_type_id\": \"DBL\",\n               \"room_type_name\": \"Double Room\",\n               \"room_number\": \"101\",\n               \"originally_booked_roomtype_id\": \"SGL\",\n               \"originally_booked_roomtype_name\": \"Single Room\",\n               \"is_virtual_room\": false,\n               \"rate_plan_id\": \"BAR\",\n               \"rate_plan_name\": \"Bar Rate\",\n               \"market_segment_id\": \"MS002\",\n               \"market_segment_name\": \"business\",\n               \"number_of_adults\": 1,\n               \"rate_gross_amount\": \"100.0\",\n               \"rate_net_amount\": \"85.0\",\n               \"room_revenue_gross_amount\": \"200.0\",\n               \"room_revenue_net_amount\": \"170.0\",\n               \"other_gross_amount\": \"45.0\",\n               \"other_net_amount\": \"38.25\",\n               \"currency_code\": \"GBP\"\n            }\n         ]\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/event/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"event\": \"reservation.update\",\n    \"tracking_id\": \"aeadfd86-f4ef-4344-9c36-ea8ad5f32d66\",\n    \"property_code\": \"986\"\n}"}],"_postman_id":"dde4483d-1511-48ec-8885-f8fc9f1f8057"},{"name":"Reservations Update (Standard Partners)","id":"95347c90-2907-4f39-945f-1be25ada03f7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"apikey","apikey":{"basicConfig":[{"key":"key","value":"x-api-key"},{"key":"value","value":"<value>"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n    \"event\": \"reservation.update\",\n    \"tracking_id\": \"{{UUID}}\",\n    \"property_code\": \"{{property_code}}\",\n    \"partner_property_code\": \"{{partner_account_id}}\",\n    \"data\": [\n        {\n            \"reservation_id\": \"RES510\",\n            \"group_reservation_id\": \"GRP510\",\n            \"shared_reservation_id\": \"SHARE123\",\n            \"status\": \"confirmed\",\n            \"arrival_date\": \"2025-11-06\",\n            \"departure_date\": \"2025-11-08\",\n            \"guest_country_code\": \"NL\",\n            \"guest_company_name\": \"ACME Unlimited\",\n            \"guest_company_id\": \"CO001\",\n            \"source_name\": \"OTA\",\n            \"source_id\": \"OTA001\",\n            \"channel_name\": \"Booking.com\",\n            \"channel_id\": \"CH001\",\n            \"travel_agent_name\": \"Genie Travels\",\n            \"travel_agent_id\": \"TA001\",\n            \"created_at\": \"2025-10-10T09:00:00Z\",\n            \"updated_at\": \"2025-11-06T12:30:00Z\",\n            \"cancelled_at\": \"2025-11-06T12:30:00Z\",\n            \"stay_dates\": [\n                {\n                    \"date\": \"2025-11-06\",\n                    \"room_reservation_id\": \"RES510-A\",\n                    \"room_type_id\": \"DBL\",\n                    \"room_type_name\": \"Double Room\",\n                    \"room_number\": \"101\",\n                    \"originally_booked_room_type_id\": \"SGL\",\n                    \"originally_booked_room_type_name\": \"Single Room\",\n                    \"is_virtual_room\": false,\n                    \"rate_plan_id\": \"BAR\",\n                    \"rate_plan_name\": \"Bar Rate\",\n                    \"market_segment_id\": \"MS001\",\n                    \"market_segment_name\": \"leisure\",\n                    \"number_of_adults\": 1,\n                    \"number_of_children\": 0,\n                    \"rate_gross_amount\": \"95.0\",\n                    \"rate_net_amount\": \"80.75\",\n                    \"room_revenue_gross_amount\": \"190.0\",\n                    \"room_revenue_net_amount\": \"161.5\",\n                    \"fnb_gross_amount\": \"45.0\",\n                    \"fnb_net_amount\": \"38.25\",\n                    \"currency_code\": \"EUR\"\n                },\n                {\n                    \"date\": \"2025-11-07\",\n                    \"room_reservation_id\": \"RES510-A\",\n                    \"room_type_id\": \"DBL\",\n                    \"room_type_name\": \"Double Room\",\n                    \"room_number\": \"101\",\n                    \"originally_booked_roomtype_id\": \"SGL\",\n                    \"originally_booked_roomtype_name\": \"Single Room\",\n                    \"is_virtual_room\": false,\n                    \"rate_plan_id\": \"BAR\",\n                    \"rate_plan_name\": \"Bar Rate\",\n                    \"market_segment_id\": \"MS002\",\n                    \"market_segment_name\": \"business\",\n                    \"number_of_adults\": 1,\n                    \"rate_gross_amount\": \"100.0\",\n                    \"rate_net_amount\": \"85.0\",\n                    \"room_revenue_gross_amount\": \"200.0\",\n                    \"room_revenue_net_amount\": \"170.0\",\n                    \"other_gross_amount\": \"45.0\",\n                    \"other_net_amount\": \"38.25\",\n                    \"currency_code\": \"GBP\"\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/reservation/","description":"<h1 id=\"reservation-endpoint-for-standard-integrations\"><strong>Reservation Endpoint for Standard Integrations</strong></h1>\n<p>For partners with <strong>standard integrations</strong> (not built against the RoomPriceGenie Open API), we provide a reservation endpoint that allows them to send reservation data for our Reporting feature. This integration follows a simplified flow compared to the Open API setup, with the differences outlined below:</p>\n<ol>\n<li><p><strong>Authentication:</strong> Authentication is done by passing the partner API key in the request header: <code>x-api-key</code>. There is <strong>no pre-authentication flow</strong> required (no access tokens, refresh tokens, or OTT exchange).</p>\n</li>\n<li><p><strong>Endpoint URL:</strong> <code>/integrations/api/v1/reservation/</code></p>\n</li>\n<li><p><strong>Property Code</strong>: The <code>property_code</code> must be the same value used in the pricing integration. In most cases, this corresponds to the <strong>partner’s account ID</strong>. If you are unsure which value to use, please contact us for confirmation.</p>\n</li>\n<li><p><strong>Payload:</strong> Apart from the differences described above, the request payload follows the same structure as documented for reservation events.</p>\n</li>\n</ol>\n<p>Any other Open API–specific concepts and flows described elsewhere in this documentation do not apply to standard integrations.</p>\n","urlObject":{"path":["integrations","api","v1","reservation",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"f9e99cb4-8183-45ee-a697-273e1ba9e5e5","name":"Reservations Update (Standard Partners)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"X-API-Key","value":"partner-api-key","type":"text"}],"body":{"mode":"raw","raw":"{\n   \"event\": \"reservation.update\",\n   \"tracking_id\": \"aeadfd86-f4ef-4344-9c36-ea8ad5f32d66\",\n   \"property_code\": \"Hotel123\", // The same property code used for the pricing integration.\n   \"partner_property_code\": \"Hotel123\", // The account ID on the partner side. It may be the same as property_code\n   \"data\": [\n      {\n         \"reservation_id\": \"RES510\",\n         \"group_reservation_id\": \"GRP510\",\n         \"shared_reservation_id\": \"SHARE123\",\n         \"status\": \"confirmed\",\n         \"arrival_date\": \"2025-11-06\",\n         \"departure_date\": \"2025-11-08\",\n         \"guest_country_code\": \"NL\",\n         \"guest_company_name\": \"ACME Unlimited\",\n         \"guest_company_id\": \"CO001\",\n         \"source_name\": \"OTA\",\n         \"source_id\": \"OTA001\",\n         \"channel_name\": \"Booking.com\",\n         \"channel_id\": \"CH001\",\n         \"travel_agent_name\": \"Genie Travels\",\n         \"travel_agent_id\": \"TA001\",\n         \"created_at\": \"2025-10-10T09:00:00Z\",\n         \"updated_at\": \"2025-11-06T12:30:00Z\",\n         \"cancelled_at\": \"2025-11-06T12:30:00Z\", // Required if status = canceled. Omit otherwise.\n         \"stay_dates\": [\n            {\n               \"date\": \"2025-11-06\",\n               \"room_reservation_id\": \"RES510-A\",\n               \"room_type_id\": \"DBL\",\n               \"room_type_name\": \"Double Room\",\n               \"room_number\": \"101\",\n               \"originally_booked_room_type_id\": \"SGL\",\n               \"originally_booked_room_type_name\": \"Single Room\",\n               \"is_virtual_room\": false,\n               \"rate_plan_id\": \"BAR\",\n               \"rate_plan_name\": \"Bar Rate\",\n               \"market_segment_id\": \"MS001\",\n               \"market_segment_name\": \"leisure\",\n               \"number_of_adults\": 1,\n               \"number_of_children\": 0,\n               \"rate_gross_amount\": \"95.0\",\n               \"rate_net_amount\": \"80.75\",\n               \"room_revenue_gross_amount\": \"190.0\",\n               \"room_revenue_net_amount\": \"161.5\",\n               \"fnb_gross_amount\": \"45.0\",\n               \"fnb_net_amount\": \"38.25\",\n               \"currency_code\": \"EUR\"\n            },\n            {\n               \"date\": \"2025-11-07\",\n               \"room_reservation_id\": \"RES510-A\",\n               \"room_type_id\": \"DBL\",\n               \"room_type_name\": \"Double Room\",\n               \"room_number\": \"101\",\n               \"originally_booked_roomtype_id\": \"SGL\",\n               \"originally_booked_roomtype_name\": \"Single Room\",\n               \"is_virtual_room\": false,\n               \"rate_plan_id\": \"BAR\",\n               \"rate_plan_name\": \"Bar Rate\",\n               \"market_segment_id\": \"MS002\",\n               \"market_segment_name\": \"business\",\n               \"number_of_adults\": 1,\n               \"rate_gross_amount\": \"100.0\",\n               \"rate_net_amount\": \"85.0\",\n               \"room_revenue_gross_amount\": \"200.0\",\n               \"room_revenue_net_amount\": \"170.0\",\n               \"other_gross_amount\": \"45.0\",\n               \"other_net_amount\": \"38.25\",\n               \"currency_code\": \"GBP\"\n            }\n         ]\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/reservation/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"event\": \"reservation.update\",\n    \"tracking_id\": \"aeadfd86-f4ef-4344-9c36-ea8ad5f32d66\",\n    \"property_code\": \"Hotel123\"\n}"},{"id":"0cdcfc78-26b8-4c56-aef1-42d66bb4c078","name":"Reservations Update (Standard Partners)","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\n   \"event\": \"reservation.update\",\n   \"tracking_id\": \"6b66d4b7-577d-493d-8cbe-81493a4cba2b\",\n   \"property_code\": \"{{property_code}}\",\n   \"partner_property_code\": \"{{partner_account_id}}\",\n   \"data\": [\n      {\n         \"arrival_date\": \"2026-01-19\",\n         \"channel_id\": \"PMS\",\n         \"channel_name\": \"PMS\",\n         \"created_at\": \"2026-01-19T16:37:25.767864Z\",\n         \"updated_at\": \"2026-04-16T02:04:50.182Z\",\n         \"cancelled_at\": \"2026-04-16T02:04:50.182Z\",\n         \"departure_date\": \"2026-01-21\",\n         \"group_reservation_id\": \"cas2630881244\",\n         \"guest_country_code\": \"DE\",\n         \"reservation_id\": \"cas2630881244\",\n         \"source_id\": \"4\",\n         \"source_name\": \"E-Mail\",\n         \"status\": \"cancelled\",\n         \"stay_dates\": [\n            {\n               \"currency_code\": \"EUR\",\n               \"date\": \"2026-01-19\",\n               \"fnb_gross_amount\": \"0\",\n               \"fnb_net_amount\": \"0\",\n               // \"is_virtual_room\": false,\n               \"number_of_adults\": 0,\n               // \"other_gross_amount\": \"52.00\",\n               // \"other_net_amount\": \"48.36\",\n               \"rate_gross_amount\": \"0\",\n               \"rate_net_amount\": \"0\",\n               \"rate_plan_id\": \"-\",\n               \"rate_plan_name\": \"-\",\n               // \"room_number\": \"501\",\n               // \"room_reservation_id\": \"cro2604542703\",\n               \"room_revenue_gross_amount\": \"0\",\n               \"room_revenue_net_amount\": \"0\",\n               \"room_type_id\": \"-\",\n               \"room_type_name\": \"-\"\n            }\n         ]\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/reservation/"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Date","value":"Fri, 06 Feb 2026 11:22:32 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Transfer-Encoding","value":"chunked"},{"key":"Connection","value":"keep-alive"},{"key":"Server","value":"cloudflare"},{"key":"allow","value":"POST, OPTIONS"},{"key":"x-frame-options","value":"DENY"},{"key":"vary","value":"Authorization, origin"},{"key":"x-content-type-options","value":"nosniff"},{"key":"referrer-policy","value":"same-origin"},{"key":"cross-origin-opener-policy","value":"same-origin"},{"key":"x-request-id","value":"7605b70e-929b-401a-bdca-a21db0121b55"},{"key":"cf-cache-status","value":"DYNAMIC"},{"key":"Nel","value":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}"},{"key":"Strict-Transport-Security","value":"max-age=2592000; includeSubDomains; preload"},{"key":"Report-To","value":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=MzS6NeAY%2FnvUhAG5vrXTmMshR%2Fvhx89L989p3U3P8tRI7llfLMNG%2FkSI%2Fqil5WwKmJe9iHSSFaGZD79KH1YHOSxDn81yRa1NMDBL2iWw98vhH%2BE7HaRhoW85kne9NAMky5LR\"}]}"},{"key":"Content-Encoding","value":"br"},{"key":"CF-RAY","value":"9c9a4525cfe8f19c-GRU"}],"cookie":[],"responseTime":null,"body":"{\n    \"event\": \"reservation.update\",\n    \"tracking_id\": \"dfb851a5-f65d-47eb-856d-098d432e3dd0\",\n    \"property_code\": \"6157ba50-1c3e-4e86-be2e-c8a25362b748\"\n}"}],"_postman_id":"95347c90-2907-4f39-945f-1be25ada03f7"}],"id":"3c10b740-5d96-44e4-9d38-21d8ac83657c","description":"<p>By providing detailed reservation data via the Open API integration, you enable RoomPriceGenie to deliver rich, actionable reporting and analytics to our common clients. This includes insights into booking patterns, market segmentation, revenue breakdowns, and guest behavior — all displayed in a user-friendly dashboard. With this integration, hoteliers can make faster, more informed decisions and better understand how their business is performing over time.</p>\n<h3 id=\"initial-setup\"><strong>Initial Setup:</strong></h3>\n<ul>\n<li><p>For each hotel, we require a minimum of <strong>2 years</strong> of reservation history, ideally <strong>3 years</strong>, along with <strong>all future reservations</strong>. This includes all reservations that have stayed at the hotel within that date range.</p>\n</li>\n<li><p>You can <strong>send up to 200 reservations</strong> in a single payload.</p>\n</li>\n</ul>\n<h3 id=\"ongoing-updates\"><strong>Ongoing Updates:</strong></h3>\n<p>After the initial setup, we expect <strong>real-time updates</strong> if possible. If real-time is not feasible, a minimum of <strong>hourly pushes</strong> is required. Each push should include <strong>all reservations that have been created, modified, checked-in/out, or cancelled</strong> since the last push.</p>\n<h3 id=\"frequently-asked-questions\"><strong>Frequently Asked Questions</strong></h3>\n<p>For more detail on specific implementation scenarios and common edge cases, refer to the <a href=\"https://postman.roompricegenie.com/#frequently-asked-questions\">Frequently Asked Questions section</a>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{access-token}}"}]},"isInherited":false},"event":[{"listen":"prerequest","script":{"id":"d1368035-1681-4772-a3c8-7410ee0ece1d","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"51200d38-42e7-477b-a552-57499787e6bb","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"_postman_id":"3c10b740-5d96-44e4-9d38-21d8ac83657c"},{"name":"🧩 Revenue Intelligence SDK","item":[{"name":"Request OTT Code","event":[{"listen":"prerequest","script":{"id":"bdd175e2-2b0e-4fab-bbb1-63bd272e7833","exec":["// 1) API key","const apiKey = pm.environment.get('partner-api-key');","if (!apiKey) throw new Error('Missing partner-api-key');","","// 2) Resolve vars from the current raw body and ensure valid JSON/types","const currentContentType = pm.request.headers.get('Content-Type');","const currentLanguage = pm.request.body?.options?.raw?.language;","","const raw = pm.request.body?.mode === 'raw' ? (pm.request.body.raw || '{}') : '{}';","const resolved = pm.variables.replaceIn(raw);","let bodyObj;","try {","  bodyObj = JSON.parse(resolved);","} catch {","  throw new Error('Body must be valid JSON after variable substitution');","}","","// Enforce required fields/types (numbers, not strings)","if (typeof bodyObj.partner_id !== 'number') bodyObj.partner_id = Number(bodyObj.partner_id);","const ts = Math.floor(Date.now() / 1000);","bodyObj.timestamp = ts;","","// Reorder to the server’s expected order and minify","const ordered = {","  scope: bodyObj.scope,","  username: bodyObj.username,","  property_code: bodyObj.property_code,","  partner_id: bodyObj.partner_id,","  timestamp: bodyObj.timestamp,","};","const message = JSON.stringify(ordered); // minified, correct order","","// 3) Compute signature over EXACT string you’ll send","const sig = CryptoJS.HmacSHA256(message, apiKey).toString(CryptoJS.enc.Hex);","","// 4) Update request and headers to match the signed string","pm.request.body.update(message);","pm.request.headers.upsert({ key: 'X-Request-Signature', value: sig });","","// Preserve UI settings","if (currentLanguage && pm.request.body?.options?.raw) {","  pm.request.body.options.raw.language = currentLanguage;","}","if (!currentContentType) {","  pm.request.headers.upsert({ key: 'Content-Type', value: 'application/json' });","}","","// Expose for debugging if needed","pm.variables.set('unix_ts', String(ts));","pm.variables.set('HMAC-SHA256-Signature', sig);"],"type":"text/javascript","packages":{},"requests":{}}}],"id":"aea383e3-ccce-4d93-8e13-f661a24ec63f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"x-request-signature","value":"{{HMAC-SHA256-Signature}}"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\"scope\":\"genieinside-widget\",\"username\":\"john@doe.com\",\"property_code\":\"345342\",\"partner_id\":1234,\"timestamp\":12345678}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/v1/connect/","description":"<h1 id=\"backend-authentication\">Backend Authentication</h1>\n<p>To initialize the SDK, you first need an OTT (one-time token). To request it, build a minified JSON body using this exact key order: scope, username, property_code, partner_id, timestamp (no spaces or line breaks, and keep numbers as numbers). Then generate an <a href=\"https://www.authgear.com/post/generate-verify-hmac-signatures\">HMAC-SHA256 signature</a> of that exact JSON string using your Partner API key and send the signature in the <code>X-Request-Signature</code> header.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Parameter</strong></th>\n<th><strong>Description</strong></th>\n<th>Type</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>scope</code></td>\n<td><code>genieinside-widget</code></td>\n<td>string</td>\n</tr>\n<tr>\n<td><code>username</code></td>\n<td>A valid email address of the user currently logged in your app.</td>\n<td>string</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td><strong>Standard Integrations</strong>: The identifier of the client's account on the partner's side  <br /><strong>OpenAPI Integrations</strong>: The same <code>property_code</code> you already use for other requests</td>\n<td>string</td>\n</tr>\n<tr>\n<td><code>partner_id</code></td>\n<td>Your partner ID provided by RoomPriceGenie</td>\n<td>integer</td>\n</tr>\n<tr>\n<td><code>timestamp</code></td>\n<td>Unix Timestamp in seconds</td>\n<td>integer</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"request-body\">Request Body</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\"scope\":\"genieinside-widget\",\"username\":\"john@doe.com\",\"property_code\":\"345342\",\"partner_id\":1234,\"timestamp\":12345678}\n\n</code></pre>\n<h3 id=\"response\">Response</h3>\n<p>The response will provide a OTT value. This is a one time token, that expires very quickly. <strong>Do not cache it</strong>. Every time you initiate the SDK, you should request a new OTT and pass it over.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"ott\": \"zltZcUH0IguNdAQZjdasNAjpC7jdJKIjPr1CnBw8\" }\n\n</code></pre>\n<p><strong>💡 Notes</strong></p>\n<ul>\n<li><p>If your system doesn't use email addresses as usernames but has email addresses associated with usernames, you must send the email address in the request. If you don't have access to users' email addresses, please reach out to discuss alternative solutions.</p>\n</li>\n<li><p>As long as your Partner ID and Partner API key are correct, and the X-Request-Signature is valid, the authentication endpoint will return an OTT. This is true even if we can’t match the property_code and/or username to an account on our side.</p>\n</li>\n<li><p>For development testing, please share an email address that is registered as a user in your system, so we can add it to a test account in RoomPriceGenie.</p>\n</li>\n</ul>\n","urlObject":{"path":["integrations","v1","connect",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"532920db-3697-4c32-a2a4-daf0e173ffcf","name":"Request OTT Code","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"x-request-signature","value":"{{HMAC-SHA256-Signature}}"}],"body":{"mode":"raw","raw":"{\"scope\":\"genieinside-widget\",\"username\":\"john@doe.com\",\"property_code\":\"345342\",\"partner_id\":1234,\"timestamp\":12345678}","options":{"raw":{"language":"json"}}},"url":"{{server-backend}}/integrations/v1/connect/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"ott\": \"zltZcUH0IgQZjdasNAjpC7jdJKIjPr1CnBw8\"\n}"}],"_postman_id":"aea383e3-ccce-4d93-8e13-f661a24ec63f"}],"id":"732befa7-6230-4b9a-b076-1d076a2cb42b","description":"<p>\"<strong>Revenue Intelligence</strong>” (formerly GenieInside) is our JavaScript SDK that adds a widget inside your PMS. The goal is simple: your shared users can see <strong>RoomPriceGenie insights</strong> right where they’re working, without switching tabs or juggling extra windows, so they can stay focused and move faster.</p>\n<img src=\"https://content.pstmn.io/7870a069-6c7f-4d95-ac66-fbb1efb8b638/aW1hZ2UucG5n\" width=\"558\" height=\"442\" />\n\n<blockquote>\n<p><em>Please note that the \"Revenue Intelligence\" SDK is still in development, so you may experience some issues during testing. We’re actively improving it and appreciate your feedback—feel free to share it with us at</em> <a href=\"mailto:integrations@roompricegenie.com\">integrations@roompricegenie.com</a> </p>\n</blockquote>\n<h2 id=\"implementation\">Implementation</h2>\n<p>To embed the “Revenue Intelligence” SDK in your PMS, add the snippet below to your frontend page template right before the closing tag. Replace <strong>OTT_KEY_HERE</strong> with the OTT returned by the <a href=\"https://postman.roompricegenie.com/#aea383e3-ccce-4d93-8e13-f661a24ec63f\">authentication request</a>, and adjust the config parameters as needed.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-html\">    &lt;script src=\"https://cdn.roompricegenie.com/latest/genie-inside-client-sdk.umd.js\" crossorigin=\"anonymous\"&gt;&lt;/script&gt;\n    &lt;script&gt;\n    GenieInside.init('OTT_KEY_HERE', {\n        environment: 'development',\n        position: 'floating',\n        language: 'en'\n    });\n    &lt;/script&gt;\n\n</code></pre>\n<p>Use the parameters below to configure the SDK. Values shown in <strong>bold</strong> are the defaults.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Parameter</strong></th>\n<th><strong>Allowed values</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>ott</code></td>\n<td>OTT token</td>\n</tr>\n<tr>\n<td><code>position</code></td>\n<td><strong>floating</strong>, bookmark</td>\n</tr>\n<tr>\n<td><code>environment</code></td>\n<td><strong>development</strong>, production</td>\n</tr>\n<tr>\n<td><code>language</code></td>\n<td><strong>en</strong>, de, es, fr, it</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"bundle-files-versioning-integrity\">Bundle (files, versioning, integrity)</h2>\n<p>Our SDK bundles are hosted on our CDN. The <code>/latest/</code> path always points to the most recently released build.</p>\n<p><strong>Bundle info (released version, file URLs, integrity hashes):</strong><br /><a href=\"https://cdn.roompricegenie.com/latest/bundle-info.json\">https://cdn.roompricegenie.com/latest/bundle-info.json</a></p>\n<p><strong>Main files (see <code>bundle-info.json</code> for exact URLs):</strong></p>\n<ul>\n<li>UMD bundle: <code>genie-inside-client-sdk.umd.js</code></li>\n<li>Iframe bundle: <code>iframe.js</code></li>\n<li>Iframe HTML: <code>iframe.html</code></li>\n<li>Type definitions: <code>GenieInside.d.ts</code></li>\n</ul>\n<p><strong>Packaging / distribution format:</strong><br />The SDK is distributed as a <strong>UMD</strong> bundle (works with <code>&lt;script&gt;</code> tag, AMD, CommonJS, and many bundlers).</p>\n<p><strong>Integrity checks (optional):</strong><br />We publish Subresource Integrity (SRI) values in the <code>integrity</code> field inside <code>bundle-info.json</code>.</p>\n<ul>\n<li><strong>Development (pre-launch):</strong> we recommend <strong>not</strong> enforcing integrity/hash checks. We are iterating quickly and <code>/latest/</code> updates over time. If you enforce integrity with <code>/latest/</code>, you’ll need to update the hash frequently.</li>\n<li><strong>Production:</strong> if you want more stability, you <strong>may</strong> enforce integrity checks (SRI). In that case, <strong>pin</strong> to a specific released version (avoid <code>/latest/</code>) and use the matching <code>integrity</code> value from <code>bundle-info.json</code>.</li>\n</ul>\n<h2 id=\"browser-compatibility\">Browser compatibility</h2>\n<p>The SDK is compatible with Chrome 64+, Firefox 67+, Safari 12+, Edge 79+</p>\n<p>Distribution format: <strong>UMD</strong> (works in browsers, Node.js, AMD, CommonJS).</p>\n<h1 id=\"troubleshooting\">Troubleshooting</h1>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Problem / Error message</strong></th>\n<th><strong>Possible reason</strong></th>\n<th><strong>Solution / Corrective action</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>OTT is invalid or expired</strong></td>\n<td>Environment mismatch: OTT generated in one environment (e.g., <strong>development</strong>) but the SDK is loaded in another (e.g., <strong>production</strong>).</td>\n<td>Make sure OTT generation and SDK configuration use the <strong>same environment</strong>.</td>\n</tr>\n<tr>\n<td></td>\n<td>OTT was reused (cached). OTT can be used <strong>only once</strong>.</td>\n<td>Do <strong>not</strong> cache the OTT. Request a <strong>new OTT</strong> every time you load the SDK (page refresh or new page).</td>\n</tr>\n<tr>\n<td></td>\n<td>OTT expired before use because it was requested too early. OTT is <strong>very short-lived</strong>.</td>\n<td>Request the OTT <strong>right before</strong> loading the SDK, and pass it to the SDK <strong>immediately</strong>.</td>\n</tr>\n<tr>\n<td><strong>Token Exchange failed</strong></td>\n<td>No account is associated with the provided <strong>property_code</strong> in RoomPriceGenie.</td>\n<td>Verify the <strong>property_code</strong> provided, and check with <strong>RoomPriceGenie</strong> that it is properly connected to an account.</td>\n</tr>\n<tr>\n<td></td>\n<td>Account exists, but the provided <strong>username</strong> does not have access to that account.</td>\n<td>Ask the <strong>hotel</strong> to confirm whether the user has access to the <strong>RoomPriceGenie</strong> account. If not, ask them to invite the user to it.</td>\n</tr>\n<tr>\n<td></td>\n<td>Account exists, but it is <strong>not active</strong> (cancelled or free trial expired).</td>\n<td>Check with <strong>RoomPriceGenie</strong> whether the account is active, and if needed, ask to be activated.</td>\n</tr>\n</tbody>\n</table>\n</div>","_postman_id":"732befa7-6230-4b9a-b076-1d076a2cb42b"},{"name":"🔬 Future Implementations","item":[{"name":"Request iframe URL","id":"9ce14903-0930-4a40-aeef-82390e3193c6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"x-request-signature","value":"{{HMAC-SHA256-Signature}}","type":"text"}],"body":{"mode":"raw","raw":"{\"scope\":\"roompricegenie-ui\",\"username\":\"john@doe.com\",\"property_code\":\"345342\",\"partner_id\":1234,\"timestamp\":12345678}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{server-backend}}/integrations/api/v1/iframe/","description":"<p>We’d love to help you offer a more seamless experience to our mutual clients. RoomPriceGenie can provide a secure URL that you can embed in your system using an iframe. This allows your users to access their RoomPriceGenie account directly within your platform—no extra logins or new windows—making it simple and convenient for them to manage rates without ever leaving your app.</p>\n<h3 id=\"request-body\">Request Body</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Parameter</strong></th>\n<th><strong>Description</strong></th>\n<th>Type</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>scope</code></td>\n<td><code>roompricegenie-ui</code></td>\n<td>string</td>\n</tr>\n<tr>\n<td><code>username</code></td>\n<td>A valid email address of the user currently logged in your app.</td>\n<td>string</td>\n</tr>\n<tr>\n<td><code>property_code</code></td>\n<td><strong>Standard Integrations</strong>: The identifier of the client's account on the partner's side  <br /><strong>OpenAPI Integrations</strong>: The same <code>property_code</code> you already use for other requests</td>\n<td>string</td>\n</tr>\n<tr>\n<td><code>partner_id</code></td>\n<td>Your partner ID provided by RoomPriceGenie</td>\n<td>integer</td>\n</tr>\n<tr>\n<td><code>timestamp</code></td>\n<td>Unix Timestamp in seconds</td>\n<td>integer</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"authentication\">Authentication</h3>\n<p>Authentication requires an HMAC-SHA256 signature passed in the <code>X-Request-Signature</code> header. To generate it, construct a minified JSON body with keys in this exact order: <code>scope</code>, <code>username</code>, <code>property_code</code>, <code>partner_id</code>, <code>timestamp</code>. Ensure there are no spaces or line breaks, and that numeric values remain as numbers. Then sign that exact JSON string using your Partner API key.</p>\n<h3 id=\"response\">Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"url\": \"https://iframe.roompricegenie.com/?token=dc2b15951b&amp;hotel_id=37&amp;language=en-US\",\n    \"valid_until\": \"2026-03-13T16:48:15.855254Z\",\n    \"message\": \"Connected hotel found\"\n}\n\n</code></pre>\n<h2 id=\"important-notes\"><strong>Important Notes</strong></h2>\n<ul>\n<li><p>If you have already implemented the Revenue Intelligence SDK, the same authentication logic applies here — only the <code>scope</code> value and endpoint URL are different.</p>\n</li>\n<li><p>The <code>username</code> must be the email address of the user currently logged into your PMS.</p>\n<ul>\n<li>If you don't have access to the user's email address, contact us to discuss alternatives.</li>\n</ul>\n</li>\n<li><p>The returned URL can be embedded in your web application using a standard tag.</p>\n</li>\n<li><p>If the email address matches a RoomPriceGenie account with access to the specified property, we will return a URL containing an authentication token that grants the same permission level as that user for that property — no additional login will be required.</p>\n</li>\n<li><p>If no matching account is found, or the user doesn't have access to the specified property, the returned URL will point to the RoomPriceGenie login page, where the user can sign in with their username and password as usual.</p>\n</li>\n</ul>\n","urlObject":{"path":["integrations","api","v1","iframe",""],"host":["{{server-backend}}"],"query":[],"variable":[]}},"response":[{"id":"768939dc-f182-470b-80ec-2ecdfe822167","name":"Account Found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\"scope\":\"roompricegenie-ui\",\"username\":\"john@doe.com\",\"property_code\":\"345342\",\"partner_id\":1234,\"timestamp\":12345678}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{server-backend}}/integrations/v1/connect/iframe/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n\t\"url\": \"https://iframe.roompricegenie.com/?token=dc2b15951b&hotel_id=37&language=en-US\",\n\t\"valid_until\": \"2026-03-13T16:48:15.855254Z\",\n\t\"message\": \"Connected hotel found\"\n}"},{"id":"3079846f-893c-4860-a72c-59cafc2657a0","name":"Account Not Found","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\"scope\":\"roompricegenie-ui\",\"username\":\"john@doe.com\",\"property_code\":\"345342\",\"partner_id\":1234,\"timestamp\":12345678}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{server-backend}}/integrations/v1/connect/iframe/"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n\t\"url\": \"https://iframe.roompricegenie.com/\",\n\t\"valid_until\": null,\n\t\"message\": \"No connected hotel found or user does not have access to the hotel\"\n}"}],"_postman_id":"9ce14903-0930-4a40-aeef-82390e3193c6"},{"name":"Create RoomPriceGenie Account","id":"e1a6e7f7-f7be-48e0-ae2b-324e83d37129","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"urlObject":{"query":[],"variable":[]},"url":""},"response":[],"_postman_id":"e1a6e7f7-f7be-48e0-ae2b-324e83d37129"}],"id":"4e94d164-613e-4d7b-9ff6-857c9a8a5c5b","_postman_id":"4e94d164-613e-4d7b-9ff6-857c9a8a5c5b","description":""}],"event":[{"listen":"prerequest","script":{"id":"e4aae7c7-a980-4b08-9b27-82ee68e8b51e","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"1d8ec0cb-e50b-4829-8f53-270f65824808","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}],"variable":[{"key":"url","value":"https://refactoringdevapi.roompricegenie.com"},{"key":"server_backend","value":"https://refactoringdevapi.roompricegenie.com"},{"key":"baseUrl","value":"{{server-backend}}"}]}