pms_write_unsupported

The listing's PMS cannot do this through its API (for example cancel on OwnerRez, or change dates on Smoobu). Do it in the PMS; the change arrives with the next sync.

HTTP 422The request was understood but refused as sent. Change it before retrying.

When it fires

The listing is managed in a PMS, and that PMS's API cannot do what you asked. Repull never fakes a write the PMS cannot make, so the request is refused and nothing is sent. Typical cases:

  • Cancelling on OwnerRez — its API has no cancel.
  • Changing the dates of a Smoobu booking — cancel and rebook, or change them in Smoobu.
  • POST /v1/reservations/quote on Mews, Cloudbeds or iGMS, which have no quote API. You can still create the booking; on iGMS a totalPrice is required.
  • platform: "owner" on a PMS listing — block owner stays in the PMS.
  • A specific unitId on Hostaway or iGMS, or a tentative hold on iGMS.
  • A group booking on any PMS except Cloudbeds.
  • Moving a PMS stay to another listing, or changing its check-in/check-out times.

provider names the PMS and message says where to make the change instead.

Response shape

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

{
  "error": {
    "code": "pms_write_unsupported",
    "message": "OwnerRez cannot cancel a booking through its API. Cancel it in OwnerRez.",
    "fix": "Cancel it in OwnerRez; the cancellation reaches Repull with the next sync.",
    "docs_url": "https://repull.dev/docs/errors/pms_write_unsupported",
    "request_id": "req_01J5X7Y8Z9ABCDEF12345678",
    "provider": "ownerrez"
  }
}

How to fix

  1. Do not retry — the same request is refused the same way.
  2. Make the change in the PMS named in `provider`. It reaches Repull with the next sync, and the matching webhook fires.
  3. Before writing, read `GET /v1/listings/{id}` → `capabilities.reservations` (`create`, `modify`, `cancel`, `quote`, `customPrice`, `notes`) to know what the listing supports.

Common gotchas

  • This is a property of the PMS's API, not of your plan or your connection. Reconnecting does not change it.
  • The per-PMS table is at PMS reservation support.

Examples

curl

# Check first: what can this listing do?
curl https://api.repull.dev/v1/listings/4118 \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
# → "capabilities": { "reservations": { "provider": "ownerrez", "cancel": false, ... } }

curl -X POST https://api.repull.dev/v1/reservations/215708/cancel \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
# → 422 pms_write_unsupported

TypeScript

const res = await fetch('https://api.repull.dev/v1/reservations/215708/cancel', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.REPULL_API_KEY}` },
})
if (res.status === 422) {
  const { error } = await res.json()
  if (error.code === 'pms_write_unsupported') {
    // Not possible through this PMS's API — tell the user to do it in error.provider
    return { doItInPms: error.provider, why: error.message }
  }
}

If you're an AI agent

The PMS's API cannot perform this write. Do not retry. Tell the user to make the change directly in the PMS named in `provider`; it syncs back automatically. Check capabilities.reservations on GET /v1/listings/{id} before attempting writes.

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

AI