managed_by_pms

The room type belongs to a hotel PMS (Cloudbeds, Mews), which owns its rooms. Change room counts in the PMS; drop `availableUnits` to write prices.

HTTP 409The resource is not in a state that allows this operation.

When it fires

You sent availableUnits(rooms to sell) for a room type that belongs to a hotel PMS, such as Cloudbeds or Mews. The PMS owns that hotel's rooms, room assignments and room counts, so Repull doesn't change them.

Nothing was written. The listing's hotel.source is "pms".

Response shape

Every Repull error follows the same envelope. The code is stable and safe to switch on.

{
  "error": {
    "code": "managed_by_pms",
    "message": "<human-readable explanation of what went wrong>",
    "docs_url": "https://repull.dev/docs/errors/managed_by_pms"
  }
}

How to fix

  1. Change room counts and stop-sells in the PMS. Repull mirrors them within minutes, and GET /v1/availability/{propertyId} then shows the new availableUnits.
  2. Leave availableUnits out of the request to write prices and restrictions; those still apply where the PMS allows them.
  3. Before writing, check the listing: only room types with hotel.source "booking" accept availableUnits.

Common gotchas

  • A batch request is refused as a whole when any of its listings is a PMS room type. Split PMS room types out of the batch, or drop availableUnits.
  • A count above the room type's unitCount is a different error: 422 invalid_params on availableUnits.
  • See Hotels & multi-unit listings for who owns which rooms.

Examples

curl

# A Cloudbeds room type
curl -i -X PUT https://api.repull.dev/v1/availability/30908 \
  -H "Authorization: Bearer $REPULL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "dates": ["2026-12-24"], "availableUnits": 4 }'
# HTTP/2 409
# {"error":{"code":"managed_by_pms","field":"availableUnits","fix":"Change room counts and stop-sells in your PMS ..."}}

TypeScript

const listing = await fetch('https://api.repull.dev/v1/listings/30908', {
  headers: { Authorization: `Bearer ${process.env.REPULL_API_KEY}` },
}).then(r => r.json())

// Only Booking.com room types take a rooms-to-sell count from the API.
const body = listing.hotel?.source === 'pms'
  ? { dates, price }                    // the PMS owns the rooms
  : { dates, price, availableUnits: 3 }

await fetch('https://api.repull.dev/v1/availability/30908', {
  method: 'PUT',
  headers: { Authorization: `Bearer ${process.env.REPULL_API_KEY}`, 'Content-Type': 'application/json' },
  body: JSON.stringify(body),
})

If you're an AI agent

The listing is a room type of a hotel PMS (hotel.source is pms), whose rooms the PMS owns. Do not retry with availableUnits. Drop availableUnits to write prices or restrictions, and tell the human to change room counts or stop-sells in their PMS; Repull mirrors them within minutes.

Hit an error that isn't covered? Email hello@repull.dev with the request id from the response headers.

AI