Open PMS API

Connect any PMS β€” or the integration platform between your PMS and other systems β€” without waiting for a built-in connection. The PMS sends each reservation to one web address whenever it changes; rooms, TVs and guests' phones follow. Mews and Apaleo have their own connection (PMS) and do not need this.

Reference: Open PMS API reference Β· OpenAPI file

How it works

Set up the connection

  1. In the console, Settings β†’ Integrations β†’ PMS, open the Open PMS API tab and press Connect Any PMS (Open PMS API). Give it a name and Save β€” it is on (only one PMS can be on at a time).
  2. Press Use the room numbers here once β€” it lists the console's room numbers and room types as the ones the PMS will send (done again by itself with every message, so new rooms are picked up).
  3. Copy the webhook address and give it, with this page, to whoever runs your PMS. The address is the password: keep it out of public places; New address replaces it at once.
  4. Send a test event checks the address. The connection's log lists every message and what it did.

Send a reservation

POST the reservation to the webhook address with Content-Type: application/json:

POST https://nnilcrwcusuhmauixpaf.supabase.co/functions/v1/integrations/v1/hooks/{key}
Content-Type: application/json

{
  "reservation": {
    "id": "R-10045",
    "status": "in_house",
    "room": "632",
    "roomType": "Suite",
    "arrival": "2026-10-25",
    "departure": "2026-10-27",
    "guest": { "name": "Jane Doe", "language": "en" }
  }
}

Several at once (up to 100) β€” for example after the PMS was offline:

{ "reservations": [ { "id": "R-10045", "status": "checked_out", "room": "632" }, { "id": "R-10046", "status": "booked", "roomType": "Deluxe", "arrival": "2026-11-02", "departure": "2026-11-05" } ] }
Field Required Notes
id yes The PMS's reservation id β€” the same on every update (letters, digits, . _ : - /, up to 120)
status yes booked, in_house, checked_out, canceled or no_show
room for in_house The room number as in the console
roomType no The room type's name as in the console
arrival, departure no Hotel-local dates, YYYY-MM-DD
guest.name no For the TV's greeting β€” Guest when left out
guest.language no en, de, ko, zh … β€” the TV and guest app use it; en when left out

Answers

Code Meaning
200 { "received": true } Taken. It is applied right after the answer β€” see the connection's log for each result
200 { "received": true, "ignored": true } The hotel switched the connection off; nothing was applied
400 { "received": false, "errors": [ … ] } The body is not valid β€” every problem is listed, nothing was applied
404 Unknown address β€” wrong, or replaced with New address
413 The body is larger than 256 KB β€” send fewer reservations at a time

A GET on the address answers 200 β€” for a PMS's "test connection" button.

curl

curl -X POST "$WEBHOOK" -H "Content-Type: application/json" \
  -d '{"reservation":{"id":"TEST-1","status":"in_house","room":"632","guest":{"name":"Test","language":"en"}}}'
curl -X POST "$WEBHOOK" -H "Content-Type: application/json" \
  -d '{"reservation":{"id":"TEST-1","status":"checked_out","room":"632"}}'

Good practice