# SiteMinder API and MCP server

> SiteMinder has APIs, but the ones that change rates, availability and restrictions or deliver reservations are for technology partners who sign a partnership agreement and certify each API (checked 11 Oct 2026). A hotel can generate its own key only for the read-only Direct Booking API.

Hotel commerce platform: a channel manager that sends rates and availability to Booking.com, Expedia and other channels, plus a booking engine and reports.

## What is the SiteMinder API?

Cotlet's SiteMinder API exposes 12 endpoints for your own SiteMinder account: list room rates, list channels, get inventory, list reservations, get reservation, get booking performance, get pace report, get rate parity, update rates, update availability, update restrictions and close dates. The list_room_rates endpoint returns room types and their room rates, with derived rates and the channels each one is mapped to. Each endpoint takes simple JSON inputs like from, to or room_rate_ids and works both as an MCP tool for agents and as a REST call for scripts.

- **Category:** [Travel](https://cotlet.dev/integrations/category/travel)
- **Endpoints:** 12 (8 read, 4 write)
- **Updated:** 2026-10-11

SiteMinder has APIs, but the ones that change rates, availability and restrictions or deliver reservations are for technology partners who sign a partnership agreement and certify each API (checked 11 Oct 2026). Cotlet is a hosted MCP server and REST API for SiteMinder with 12 endpoints (8 read, 4 write): your AI agent signs in as you and does the work.

## Does SiteMinder have an official API?

SiteMinder has APIs, but the ones that change rates, availability and restrictions or deliver reservations are for technology partners who sign a partnership agreement and certify each API (checked 11 Oct 2026). A hotel can generate its own key only for the read-only Direct Booking API.

| Task | SiteMinder official | Cotlet |
|---|---|---|
| Update rates for a date range | Partly: Certified PMS or RMS partners only (pmsXchange, SMX) | Yes |
| Set availability per room type | Partly: Certified partners only | Yes |
| Stop sell, min stay, CTA and CTD | Partly: Certified partners only | Yes |
| Read rates and availability | Partly: Direct Booking API, key from the property, read only, for booking flows | Yes |
| Search and read reservations | Partly: Delivered to a certified PMS, not to your own script | Yes |
| Booking performance by channel | No: Insights report in the platform only | Yes |
| Pace report against last year | No: Insights report in the platform only | Yes |
| Rate parity across OTAs | No: Platform report, SiteMinder Plus only | Yes |

Sources: [SiteMinder Developer Guide FAQ](https://developer.siteminder.com/get-started/resources/faq), [SiteMinder Help: Direct Booking API](https://help-platform.siteminder.com/en/articles/15689086-direct-booking-api), [SiteMinder Help: update rates, availability and restrictions in the inventory grid](https://help-platform.siteminder.com/en/articles/8674045-update-rates-availability-and-restrictions-in-the-inventory-grid), [SiteMinder Help: view your reservations](https://help-platform.siteminder.com/en/articles/8672859-view-your-reservations), [SiteMinder Help: dynamic pricing with Dynamic Revenue Plus](https://help-platform.siteminder.com/en/articles/10515303-dynamic-pricing-with-dynamic-revenue-plus), [SiteMinder Help: Booking performance report](https://help-platform.siteminder.com/en/articles/8673697-booking-performance-report)

## For AI agents

```text
SiteMinder has APIs, but the ones that change rates, availability and restrictions or deliver reservations are for technology partners who sign a partnership agreement and certify each API (checked 11 Oct 2026). A hotel can generate its own key only for the read-only Direct Booking API.
Cotlet provides a hosted MCP server and REST API for SiteMinder: 12 tools (8 read, 4 write).
Access       Request access at https://cotlet.dev/app/signup?app=siteminder; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/siteminder
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_room_rates, list_channels, get_inventory, list_reservations, get_reservation, get_booking_performance, get_pace_report, get_rate_parity, update_rates, update_availability, update_restrictions, close_dates
Confirm      update_rates, update_availability, update_restrictions, close_dates (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/siteminder-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=siteminder (SiteMinder is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to SiteMinder once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted SiteMinder server that someone else maintains, including non-developers.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to SiteMinder in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following SiteMinder's terms; Cotlet is not affiliated with SiteMinder.
```

## What can an AI agent do in SiteMinder?

Cotlet is best for independent hotels and small groups without a certified PMS or RMS who want their AI agent to change rates, restrictions and availability and read reservations and reports without running or fixing a server.

- **[Update rates for busy dates](https://cotlet.dev/integrations/siteminder-api-mcp-server/update-rates-for-busy-dates)**: "The city marathon is on 6 and 7 December. Raise every base room rate by 25% for 5 to 7 December on all channels, but keep the Standard Double at no more than 210." → `list_room_rates`, `get_inventory`, `update_rates`
- **[Set minimum stay and closed to arrival for peak dates](https://cotlet.dev/integrations/siteminder-api-mcp-server/set-minimum-stay-and-closed-to-arrival)**: "For Christmas, close all room rates to arrivals on 24 and 25 December and set a 3-night minimum stay from 23 to 27 December on every channel that supports it." → `list_channels`, `list_room_rates`, `update_restrictions`, `close_dates`
- **[Fill gap nights between bookings](https://cotlet.dev/integrations/siteminder-api-mcp-server/fill-gap-nights)** (runs: daily): "Every morning, find single and two-night gaps between bookings in the next 60 days that our minimum stay blocks, and lower the minimum stay on those nights so they can sell." → `list_room_rates`, `get_inventory`, `list_channels`, `update_restrictions`
- **Daily arrivals list from SiteMinder** (runs: daily): "List every reservation checking in tomorrow, with channel, room and total, as a table." → `list_reservations`, `get_reservation`
- **[Weekly channel performance and pace report](https://cotlet.dev/integrations/siteminder-api-mcp-server/weekly-channel-performance-report)** (runs: weekly): "Every Monday, compare last week's bookings by channel with the week before, and tell me how the next 30 days pace against last year." → `get_booking_performance`, `get_pace_report`, `get_rate_parity`
- **Close rooms and dates when rooms go out of order**: "We have a burst pipe in rooms 201 to 204: drop Standard Double availability by 4 for the next two weeks." → `get_inventory`, `update_availability`, `close_dates`
- **Check rate parity across OTAs** (runs: weekly): "Check rate parity for the next 30 days and tell me where Expedia undercuts our direct rate." → `get_rate_parity`

## Can SiteMinder automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a SiteMinder connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to fill gap nights between bookings, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

| Where | How to connect | How to schedule |
|---|---|---|
| Your AI agent | Add https://cotlet.dev/mcp/v1 with your API key. | A scheduled agent run, for example a Claude Code routine. |
| n8n | MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/siteminder/{tool}. | Schedule Trigger node. |
| Make | HTTP module: POST https://cotlet.dev/api/v1/siteminder/{tool} with an Authorization: Bearer header and a JSON body. | Scenario schedule. |
| Zapier | Webhooks by Zapier: POST https://cotlet.dev/api/v1/siteminder/{tool} with the same header and body. | Schedule by Zapier trigger. |
| Your own script | POST https://cotlet.dev/api/v1/siteminder/{tool} with your API key. | cron or GitHub Actions. |

## Tools

**For AI agents:** Every endpoint and its schema is public. The 12 endpoints on this page, with parameters and example responses, can be listed without an account. Calling one returns 403 until the account has an API key with access to SiteMinder.

### list_room_rates

Room types and their room rates, with derived rates and the channels each one is mapped to. Access: read. REST: `POST /api/v1/siteminder/list_room_rates`.

No parameters.

Returns every room type with its room rates. A derived rate shows the base rate it follows; SiteMinder does not let you set derived rates by hand. Use the IDs from here in get_inventory and the update tools.

Example response:

```json
{
  "room_types": [
    {
      "room_type_id": "rt_1021",
      "name": "Standard Double",
      "room_rates": [
        {
          "room_rate_id": "rr_48210",
          "name": "Standard Double Flexible",
          "type": "base",
          "channels": [
            "Booking.com",
            "Expedia",
            "Direct Booking"
          ]
        }
      ]
    },
    {
      "room_type_id": "rt_1022",
      "name": "Deluxe King",
      "room_rates": [
        {
          "room_rate_id": "rr_48213",
          "name": "Deluxe King Flexible",
          "type": "base",
          "channels": [
            "Booking.com",
            "Expedia",
            "Agoda",
            "Direct Booking"
          ]
        },
        {
          "room_rate_id": "rr_48214",
          "name": "Deluxe King Non-refundable",
          "type": "derived",
          "derived_from": "rr_48213",
          "channels": [
            "Booking.com",
            "Expedia"
          ]
        }
      ]
    }
  ]
}
```

### list_channels

Connected booking channels with status and the data each channel rate supports. Access: read. REST: `POST /api/v1/siteminder/list_channels`.

No parameters.

Returns the channels connected to the property, including Direct Booking, with their status. For each channel rate it lists the data SiteMinder can send: rates, availability and the restrictions. Not every channel rate supports every type, so check here before a restriction change.

Example response:

```json
{
  "channels": [
    {
      "channel": "Booking.com",
      "status": "enabled",
      "supports": [
        "rates",
        "availability",
        "stop_sell",
        "min_los",
        "max_los",
        "cta",
        "ctd"
      ]
    },
    {
      "channel": "Agoda",
      "status": "enabled",
      "supports": [
        "rates",
        "availability",
        "stop_sell",
        "min_los"
      ]
    },
    {
      "channel": "Direct Booking",
      "status": "enabled",
      "supports": [
        "rates",
        "availability",
        "stop_sell",
        "min_los",
        "max_los",
        "cta",
        "ctd"
      ]
    }
  ]
}
```

### get_inventory

The inventory grid for a date range: rates, availability and restrictions per room rate and channel. Access: read. REST: `POST /api/v1/siteminder/get_inventory`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First date of the range. Today or later. |
| `to` | date | yes | Last date of the range. |
| `room_type_ids` | string[] | no | Only these room types. Default: all. |
| `channel` | string | no | Show channel rates for one channel. Default: room rates. |

Returns what the inventory grid shows, one row per date: rate, availability and restrictions for each room rate. Pass channel to see the values sent to one channel instead. SiteMinder shows only today and future dates here. A dash in the grid, returned as null, means the channel rate does not support that data.

Example response:

```json
{
  "room_rate_id": "rr_48213",
  "channel": null,
  "dates": [
    {
      "date": "2026-12-04",
      "rate": "159.00",
      "availability": 4,
      "stop_sell": false,
      "min_los": 1,
      "cta": false,
      "ctd": false
    },
    {
      "date": "2026-12-05",
      "rate": "159.00",
      "availability": 2,
      "stop_sell": false,
      "min_los": 2,
      "cta": false,
      "ctd": false
    }
  ]
}
```

### list_reservations

Reservations with channel, status, dates, room and total. Searches the last 548 days. Access: read. REST: `POST /api/v1/siteminder/list_reservations`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `date_type` | enum | no | booked_on, check_in, check_out or cancelled_on. Default: booked_on. |
| `from` | date | no | Start of the date range. |
| `to` | date | no | End of the date range. |
| `status` | enum | no | booked, modified or cancelled. Default: all. |
| `channel` | string | no | Only reservations from this channel. |
| `guest_last_name` | string | no | Guest last name. |
| `pms_delivery_status` | enum | no | pending, delivered or failed. Default: all. |
| `limit` | integer | no | Page size. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

Returns reservations that match your filters, with booking reference, channel, status, stay dates, room and total. SiteMinder searches only reservations created or checked out within the last 548 days. Guest email, phone and card details are not returned. Pass booking_reference to get_reservation for the full record.

Example response:

```json
{
  "reservations": [
    {
      "booking_reference": "4830217655",
      "channel": "Booking.com",
      "status": "booked",
      "check_in": "2026-10-12",
      "check_out": "2026-10-14",
      "nights": 2,
      "room_type": "Standard Double",
      "guests": 2,
      "total": {
        "amount": "318.00",
        "currency": "EUR"
      },
      "guest_last_name": "Rossi",
      "pms_delivery": "delivered"
    },
    {
      "booking_reference": "BBN-BB0000412907",
      "channel": "Direct Booking",
      "status": "booked",
      "check_in": "2026-10-12",
      "check_out": "2026-10-13",
      "nights": 1,
      "room_type": "Deluxe King",
      "guests": 1,
      "total": {
        "amount": "172.00",
        "currency": "EUR"
      },
      "guest_last_name": "Lindqvist",
      "pms_delivery": "pending"
    }
  ],
  "next_cursor": null
}
```

### get_reservation

One reservation: stay, rooms, rate plan, channel, status history and payment summary. No guest contact or card numbers. Access: read. REST: `POST /api/v1/siteminder/get_reservation`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `booking_reference` | string | yes | Booking reference from list_reservations. |

Returns one reservation by booking reference: status and the time it last changed, stay dates and length, estimated arrival time, room and number of guests, rate plan, total rate and the channel, with the secondary source such as Hotels.com via Expedia where SiteMinder shows one. SiteMinder shows guest email, phone and card details only on a trusted device, so they are not returned.

Example response:

```json
{
  "booking_reference": "4830217655",
  "channel": "Booking.com",
  "status": "booked",
  "status_changed_at": "2026-10-02T14:20:00Z",
  "check_in": "2026-10-12",
  "check_out": "2026-10-14",
  "nights": 2,
  "estimated_arrival": "15:00",
  "rooms": [
    {
      "room_type": "Standard Double",
      "room_rate": "Standard Double Flexible",
      "guests": 2
    }
  ],
  "total": {
    "amount": "318.00",
    "currency": "EUR"
  },
  "pms_delivery": "delivered"
}
```

### get_booking_performance

Room and total revenue, reservations, room nights, ADR, ALOS, lead time and cancellations, split by channel, market, room or rate. Access: read. REST: `POST /api/v1/siteminder/get_booking_performance`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First date of the range. Today or later. |
| `to` | date | yes | Last date of the range. |
| `date_basis` | enum | no | booked_on or stay_date. Default: booked_on. |
| `breakdown` | enum | no | channel_mix, source_market, room_types or rate_plans. Default: channel_mix. |

Returns the Insights > Booking performance numbers for a period: room revenue, total revenue, reservations after cancellations, room nights, average lead time, ADR, average length of stay and cancelled reservations, plus the breakdown you ask for. Revenue in other currencies is converted to your default currency at xe.com rates. With date_basis stay_date, total revenue is not returned and room nights count only the chosen period.

Example response:

```json
{
  "from": "2026-09-01",
  "to": "2026-09-30",
  "date_basis": "booked_on",
  "currency": "EUR",
  "room_revenue": "42500.00",
  "total_revenue": "45000.00",
  "reservations": 212,
  "cancelled_reservations": 18,
  "room_nights": 500,
  "avg_lead_time_days": 21.4,
  "adr": "90.00",
  "alos": 2.36,
  "channel_mix": [
    {
      "channel": "Booking.com",
      "reservations": 95,
      "room_nights": 225,
      "room_revenue": "19500.00"
    },
    {
      "channel": "Expedia",
      "reservations": 55,
      "room_nights": 135,
      "room_revenue": "11500.00"
    },
    {
      "channel": "Direct Booking",
      "reservations": 45,
      "room_nights": 105,
      "room_revenue": "9000.00"
    },
    {
      "channel": "Agoda",
      "reservations": 17,
      "room_nights": 35,
      "room_revenue": "2500.00"
    }
  ]
}
```

### get_pace_report

Reservations, revenue, room nights and ADR for a period, compared with the same period last year. Access: read. REST: `POST /api/v1/siteminder/get_pace_report`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | no | Start of the period. Default: today. |
| `to` | date | no | End of the period. Default: 30 days from today. |

Returns the Insights > Pace numbers: reservations, reservation revenue (nightly room rates, without extras and card surcharges), room nights and ADR for the period and for last year, with the change in percent. The default period is the next 30 days; SiteMinder shows one year of forward-looking pace data. Source markets are included.

Example response:

```json
{
  "from": "2026-10-12",
  "to": "2026-11-10",
  "currency": "EUR",
  "this_year": {
    "reservations": 148,
    "revenue": "28400.00",
    "room_nights": 341,
    "adr": "83.28"
  },
  "last_year": {
    "reservations": 131,
    "revenue": "25100.00",
    "room_nights": 302,
    "adr": "83.11"
  },
  "change_percent": {
    "reservations": 13,
    "revenue": 13.1,
    "room_nights": 12.9,
    "adr": 0.2
  },
  "source_markets": [
    {
      "country": "DE",
      "room_nights": 96
    },
    {
      "country": "GB",
      "room_nights": 74
    }
  ]
}
```

### get_rate_parity

Your rates on Agoda, Booking.com, Expedia, HRS and Direct Booking by stay date. Needs SiteMinder Plus. Access: read. REST: `POST /api/v1/siteminder/get_rate_parity`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First date of the range. Today or later. |
| `to` | date | yes | Last date of the range. |
| `nights` | integer | no | 1 to 7. Default: 1. |
| `guests` | integer | no | 1 or 2. Default: 2. |
| `include_taxes` | boolean | no | Fully inclusive rates instead of base rates. Default: false. |

Returns the Insights > Rate parity grid: your rate on each of the five channels for each stay date, with a flag for channels below your Direct Booking rate. A cell can hold MLOS (a minimum stay applies), SOLD (no availability) or N/A instead of a rate. Dates reach 30 days ahead, or 90 with Dynamic Revenue Plus. A refresh times out after about two minutes; call again for dates that did not load. Without SiteMinder Plus the call fails with a plan error.

Example response:

```json
{
  "nights": 1,
  "guests": 2,
  "include_taxes": false,
  "currency": "EUR",
  "dates": [
    {
      "date": "2026-10-17",
      "rates": {
        "Agoda": "142.00",
        "Booking.com": "142.00",
        "Expedia": "138.00",
        "HRS": "142.00",
        "Direct Booking": "142.00"
      },
      "below_direct": [
        "Expedia"
      ]
    },
    {
      "date": "2026-10-18",
      "rates": {
        "Agoda": "149.00",
        "Booking.com": "149.00",
        "Expedia": "MLOS",
        "HRS": "149.00",
        "Direct Booking": "149.00"
      },
      "below_direct": []
    }
  ]
}
```

### update_rates

Set the rate for room rates or channel rates over a date range. Goes live on mapped channels. Access: write, asks the user first. REST: `POST /api/v1/siteminder/update_rates`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `room_rate_ids` | string[] | yes | Room rate IDs from list_room_rates. |
| `from` | date | yes | First date of the range. Today or later. |
| `to` | date | yes | Last date of the range. |
| `rate` | string | yes | New nightly rate, as a decimal in the property currency. |
| `channels` | string[] | no | Only these channels. Default: the room rate for all mapped channels. |
| `days_of_week` | string[] | no | Only these weekdays (mon, tue, wed, thu, fri, sat, sun). Default: all days. |

Sets one nightly rate for the room rates you list, on all mapped channels or only the channels you name. Derived rates cannot be set; they follow their base rate by their own rules. Channels receive updates only inside their maximum update period. If a two-way PMS, RMS or CRS sends rates to SiteMinder, it overwrites this change. Large updates can take a few minutes. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "status": "updated",
  "room_rates": 1,
  "dates": 8,
  "channels": [
    "Booking.com",
    "Expedia",
    "Agoda",
    "Direct Booking"
  ],
  "derived_rates_updated": 1,
  "skipped": []
}
```

### update_availability

Set the number of rooms to sell per room type over a date range, for all channels. Access: write, asks the user first. REST: `POST /api/v1/siteminder/update_availability`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `room_type_ids` | string[] | yes | Room type IDs from list_room_rates. |
| `from` | date | yes | First date of the range. Today or later. |
| `to` | date | yes | Last date of the range. |
| `rooms` | integer | yes | Rooms available per night. |
| `days_of_week` | string[] | no | Only these weekdays (mon, tue, wed, thu, fri, sat, sun). Default: all days. |

Sets rooms available per night for a room type. SiteMinder manages availability at room type level, so it applies to every channel; to limit one channel, use close_dates or update_restrictions. Availability 0 closes the whole room type and all its rates. If a two-way PMS, RMS or CRS sends availability to SiteMinder, it overwrites this change. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "status": "updated",
  "room_types": 1,
  "dates": 14,
  "rooms": 6,
  "channels": "all"
}
```

### update_restrictions

Set stop sell, minimum or maximum length of stay, closed to arrival or closed to departure. Access: write, asks the user first. REST: `POST /api/v1/siteminder/update_restrictions`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `room_rate_ids` | string[] | yes | Room rate IDs from list_room_rates. |
| `from` | date | yes | First date of the range. Today or later. |
| `to` | date | yes | Last date of the range. |
| `restrictions` | object | yes | Any of stop_sell, cta, ctd (boolean), min_los, max_los (integer). |
| `channels` | string[] | no | Only these channels. Default: all mapped channels. |
| `days_of_week` | string[] | no | Only these weekdays (mon, tue, wed, thu, fri, sat, sun). Default: all days. |

Sets the restrictions you pass for the room rates and dates you give, on all mapped channels or only the channels you name. Set stop_sell, cta or ctd to false to remove them. Not every channel rate supports every restriction; unsupported ones are listed under skipped. A connected two-way PMS, RMS or CRS overwrites restrictions set in SiteMinder. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "status": "updated",
  "room_rates": 2,
  "dates": 3,
  "channels": [
    "Booking.com",
    "Expedia",
    "Direct Booking"
  ],
  "skipped": [
    {
      "channel": "Agoda",
      "reason": "CTA not supported by this channel rate"
    }
  ]
}
```

### close_dates

Stop sell the room rates you pick, or a whole channel, for a date range. Access: write, asks the user first. REST: `POST /api/v1/siteminder/close_dates`.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First date of the range. Today or later. |
| `to` | date | yes | Last date of the range. |
| `room_rate_ids` | string[] | no | Only these room rates. Default: all. |
| `channels` | string[] | no | Close only these channels. Default: all mapped channels. |

Applies a stop sell for the dates you give: to every room rate, to the room rates you pick (all their channel rates close), or to one channel. Other rates and channels stay open. To reopen, call update_restrictions with stop_sell set to false. A connected two-way PMS, RMS or CRS overwrites stop sells set in SiteMinder. By default you confirm each call; you can switch that off for this tool.

Example response:

```json
{
  "status": "closed",
  "room_rates": 2,
  "dates": 8,
  "channels": [
    "Booking.com",
    "Expedia",
    "Direct Booking"
  ]
}
```

## How do I connect SiteMinder to Claude Code, Codex or Cursor?

Connecting SiteMinder takes three steps: request access, sign in to SiteMinder once, then add one MCP server or call the REST API with the same key.

### Connect SiteMinder to your agent.

1. **Create an account** Sign up and add SiteMinder in the console. Your API key is there too.

2. **Sign in to SiteMinder once** Open the connect page from the console and sign in to SiteMinder the way you always do. We keep the session, never your password, and you can revoke it anytime.

3. **Add Cotlet to your agent** Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

   Claude Code:

```
claude mcp add --transport http cotlet \
  https://cotlet.dev/mcp/v1 \
  --header "Authorization: Bearer $COTLET_API_KEY"
```

   Cursor:

```
{
  "mcpServers": {
    "cotlet": {
      "url": "https://cotlet.dev/mcp/v1",
      "headers": {
        "Authorization": "Bearer ${COTLET_API_KEY}"
      }
    }
  }
}
```

   Codex:

```
# ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY"
```

4. **Ask your agent** Ask in plain words. Your agent finds the SiteMinder tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

```
The city marathon is on 6 and 7 December. Raise every base room rate by 25% for 5 to 7 December on all channels, but keep the Standard Double at no more than 210.
```

### Call SiteMinder from your scripts.

1. **Export your API key** Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

```
export COTLET_API_KEY="cotlet_..."
```

2. **Call a tool** Every tool is a POST endpoint at /api/v1/siteminder/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

```
curl https://cotlet.dev/api/v1/siteminder/update_restrictions \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"room_rate_ids":["rr_48213","rr_48214"],"from":"2026-12-24","to":"2026-12-26","restrictions":{"cta":true,"min_los":3}}'
```

3. **Read the result** You get plain JSON back, ready for your script. A failed call costs nothing.

```
{
  "status": "updated",
  "room_rates": 2,
  "dates": 3,
  "channels": [
    "Booking.com",
    "Expedia",
    "Direct Booking"
  ],
  "skipped": [
    {
      "channel": "Agoda",
      "reason": "CTA not supported by this channel rate"
    }
  ]
}
```

## Why use Cotlet for SiteMinder?

**Built for agents**

- One MCP server for every app you connect.
- The same tools as a REST API for scripts and cron jobs.
- Works with Claude Code, Codex and Cursor.

**Your login stays yours**

- You sign in to SiteMinder yourself. We keep only the session, encrypted with AES-256.
- The model never sees a login.
- No stored passwords, no CAPTCHA solving, no MFA bypass.

**You stay in control**

- Pick read only, or read and write.
- Anything that reaches other people waits for your OK, unless you switch it off per tool.
- Revoke access in one click.

**Kept working for you**

- We test every integration daily.
- When SiteMinder changes, the tool pauses until we fix it.
- Failed calls cost nothing.

## Is there a SiteMinder MCP server on GitHub?

SiteMinder publishes no MCP server (checked 11 Oct 2026). A hotel without a certified PMS or RMS changes rates in the inventory grid or Bulk update, reads the Reservations tab and Insights reports, and downloads reservations as CSV by hand.

|  | SiteMinder by hand | Cotlet |
|---|---|---|
| Setup | None, you already have the login | Request access, sign in to SiteMinder once in your browser, add one MCP server or API key |
| Rate and restriction changes | Bulk update form: one value, one date range, the room rates and channels you tick | Your agent applies a rule across dates, room rates and channels; you confirm each change |
| Reservations and reports | Filter the Reservations tab, download CSV, open Insights | Your agent reads reservations, booking performance, pace and parity as data |
| When SiteMinder changes | You learn the new screens | Our team tests it daily and fixes it for you; failed calls are free |
| Your SiteMinder session | Your browser, signed in by you with MFA; when it expires you sign in again | Encrypted in an EU vault, limited to the actions you allow, revoked in one click; if it expires, your agent gets a link to sign in again |
| Where it runs | Your browser, when you are at the desk | Hosted: Claude Code, Codex, Cursor, n8n and scripts, also on a schedule |
| Price | Free, paid for with your time | Free 7-day trial with 5,000 credits, then credits per call |

### Which one fits you

**Pick Cotlet if**

- you are not a developer, or you do not want to maintain a server
- you need it to keep working when SiteMinder changes, without checking it yourself
- your agent or a script should run it on a schedule, also while your computer is off

**Pick an open-source server if**

- you are comfortable installing, updating and fixing it yourself
- you want the session to stay on your own computer
- you only need it now and then, from one MCP client

## How much does the SiteMinder API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the SiteMinder API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

| Size | Price | Credits / month | Per credit |
|---|---|---|---|
| Solo | $29/mo | 3,000 | about $0.0097 |
| Pro | $99/mo | 12,000 | about $0.0083 |
| Agency | $299/mo | 40,000 | $0.0075 |

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the `Authorization: Bearer` header. [See full pricing](https://cotlet.dev/pricing)

## How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own SiteMinder account.

- **Company details:** The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. [Terms](https://cotlet.dev/terms)
- **Your session:** You sign in to SiteMinder yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a SiteMinder tool you allowed. When it expires, your agent gives you a link to sign in again. [Security](https://cotlet.dev/security)
- **Revoking access:** Disconnect SiteMinder in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
- **What we never do:** Store passwords, solve CAPTCHAs or bypass MFA.
- **SiteMinder's terms:** You use your own SiteMinder account and stay responsible for following SiteMinder's terms. Cotlet is independent and not affiliated with SiteMinder. [Terms](https://cotlet.dev/terms)
- **Contact:** Questions about the company, security or an app: [contact@cotlet.dev](mailto:contact@cotlet.dev)

## Frequently asked questions

**How do I get access?**

Request access and pick SiteMinder. Cotlet reviews each request and emails you your API key.

**Do I need to be technical?**

No. You sign in to SiteMinder once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

**Is a hosted server safe? My SiteMinder session would leave my computer.**

Cotlet keeps your SiteMinder session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

**Does it work if my hotel has a connected PMS or RMS?**

Reads work either way. For changes, SiteMinder says a two-way PMS, RMS or CRS overwrites manual updates in the inventory grid, so rates, availability and restrictions are changed in that system. Cotlet changes the same grid you do, so use the write tools only for data your PMS does not sync.

**Can it cancel or change a channel reservation?**

No. SiteMinder says channel bookings from Booking.com, Expedia and other OTAs cannot be cancelled in the platform; the guest or you must cancel at the channel. Cotlet reads reservations and does not change them.

**Does it return guest emails, phone numbers or card details?**

No. Since 22 Sep 2026 SiteMinder shows guest contact and card details, and allows reservation downloads, only on a trusted device (SiteMinder Help: Trusted devices). get_reservation leaves those fields out.

**Can my agent post or send messages in SiteMinder without asking me?**

No. Every call to update_rates, update_availability, update_restrictions or close_dates waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals.

**Can I use the SiteMinder API in n8n?**

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/siteminder/{tool} from the HTTP Request node.
