{
  "openapi": "3.1.0",
  "info": {
    "title": "Channex.io — Public API",
    "version": "0.0.0"
  },
  "tags": [
    {
      "name": "Properties",
      "description": "Manage Properties — the physical premises you sell: hotels, motels, lodges, cabins, chalets, apartments and the like. Each property has its own address and details, so create one property per premises rather than combining several into a single entry."
    },
    {
      "name": "Room Types",
      "description": "Manage Room Types — the accommodation inventory (rooms, villas, dormitory beds) of a Property."
    },
    {
      "name": "Rate Plans",
      "description": "Manage Rate Plans — pricing plans of how to sell Room Types: prices per occupancy, rate derivation rules, and per-weekday restriction defaults."
    },
    {
      "name": "Photos",
      "description": "Upload and manage Property and RoomType photos."
    },
    {
      "name": "Taxes",
      "description": "Manage Taxes — individual charges (VAT, city tax, fees) applicable to a Rate Plan or Property. Taxes reach a Rate Plan grouped in a Tax Set."
    },
    {
      "name": "Tax Sets",
      "description": "Manage Tax Sets — named groups of Taxes applied to Rate Plans, with the order the taxes are calculated in. The first set of a Property becomes its default and is applied to every new Rate Plan of the Property automatically; a Rate Plan detached from a set falls back to it. See `default_tax_set_id` on Properties and `tax_set_id` on Rate Plans."
    },
    {
      "name": "Hotel Policies",
      "description": "Manage Hotel Policies — general property rules: check-in/out windows, guest limits, internet, parking, pets, and smoking. A policy belongs to one property, and the property points at it through `hotel_policy_id` (see the Properties resource); deleting the policy clears that reference."
    },
    {
      "name": "ARI",
      "description": "Read and update Availability, Rates and Inventory. Rates and restrictions are held per Rate Plan and date; real availability is held per Room Type and date, and every Rate Plan of that Room Type reads it back as its own `availability`. Updates on both paths are queued: the response references a background task per Property (see the Tasks resource), and the new values are readable a moment later rather than at once. The `availability_offset` and `max_availability` values a read returns are set through Channel Availability Rules, not here."
    },
    {
      "name": "Channel Availability Rules",
      "description": "Availability overrides (stop-sales, offsets, caps) for specific Room Types and\nChannels over a date range — closing out a channel for a holiday week, or capping\nwhat one Room Type publishes to one Channel."
    },
    {
      "name": "Tasks",
      "description": "Read-only log of asynchronous tasks processed for a Property (channel syncs, scheduled updates), with timing and outcome."
    },
    {
      "name": "Facilities",
      "description": "Read-only dictionary of property- and room-type-level facilities (amenities).\nChannex maintains both dictionaries; they cannot be added to through the API.\nContact Channex to have a missing facility added."
    },
    {
      "name": "Reference Data",
      "description": "Static reference lists: time zones and supported currencies."
    },
    {
      "name": "Bookings",
      "description": "Bookings received from the connected channels, together with the revisions they are built from. A booking is the current state of a reservation — the latest of its revisions; a revision is one parsed and normalised message from a booking source. Read bookings and their revisions, pull the feed of revisions not yet acknowledged, acknowledge what you received, and inspect the raw source message a revision was parsed from. To keep a PMS in step, pull the feed rather than polling the booking list; either source works for the initial pull."
    },
    {
      "name": "Booking CRS",
      "description": "Creating and updating bookings from your own system rather than receiving them from a channel, including bookings that originated at an OTA. Requires the Booking CRS application installed on the Property; the API is in beta and may change."
    },
    {
      "name": "Booking Reporting",
      "description": "Reports sent back to the OTA about what happened with a booking: a guest no-show, invalid credit card details, a cancellation caused by them, a change of stay, and guest misconduct. Supported for Booking.com bookings; no-shows for Expedia as well."
    },
    {
      "name": "Booking Payouts",
      "description": "What Booking.com pays out for a booking: the payout details, the price breakdown behind them, and the bank transfer payout. Available for bookings that came through a Booking.com channel."
    },
    {
      "name": "Booking Payments",
      "description": "Payments of a booking: list them and process charges, pre-authorizations, settlements, voids, and refunds. Requires the Payments application installed on the Property; without it every operation here answers `403 Forbidden`."
    },
    {
      "name": "Booking Messages",
      "description": "Chat with guests at the booking level: read and send the messages of a booking, and fetch them from the channel on demand. Requires the Messages & Reviews application installed on the Property."
    },
    {
      "name": "Groups",
      "description": "Manage Groups — sets of Properties you manage together, and the users who may reach them. Every Property belongs to at least one Group and may belong to several; a Group that still holds a Property cannot be deleted."
    },
    {
      "name": "Group Users",
      "description": "Manage Group Users — a user's membership of a Group, which grants them access to every Property in it. A membership carries a role and, optionally, access policy overrides on top of it."
    },
    {
      "name": "Property Users",
      "description": "Manage Property Users — a user's access to a single Property. An access carries a role and, optionally, access policy overrides on top of it, and ownership can be handed to another user."
    },
    {
      "name": "Live Feed",
      "description": "Feed of notable account events (new bookings, synchronization errors, guest requests): list and read them, and resolve actionable guest requests."
    },
    {
      "name": "Webhooks",
      "description": "Push notifications for what happens on an account. A webhook subscribes a callback URL\nto a set of events; when one occurs, Channex sends it a `POST` request.\n\nA webhook watches one property, or — created with `property_id: null` — every property\nof a billing account. A new webhook is inactive until `is_active` is set.\n\n## What is delivered\n\nEvery delivery is a `POST` to `callback_url` with a JSON body of five keys:\n\n- `event` — the event name, one of the values `/webhooks/events` lists.\n- `property_id` — the property the event happened on.\n- `user_id` — the user who caused it, or `null` for events the platform raises itself,\n  which is most of them. Useful for ignoring changes your own integration made.\n- `timestamp` — when the event happened, ISO 8601 UTC with microseconds, e.g.\n  `2026-09-21T13:58:55.587742Z`.\n- `payload` — the event's own data. Present only when the webhook's `send_data` is\n  true; when it is false the key is absent altogether and the other four are all the\n  delivery carries.\n\nA signed webhook carries three `x-hmac-*` headers besides. See the Webhook Signing Keys\nresource for what they hold and how to verify them — the `x-hmac-timestamp` header is\nUnix seconds, not the body's `timestamp`.\n\n## Retries\n\nA delivery is successful when the callback URL answers `2xx`. A `5xx`, a connection\nrefused, a DNS failure, a timeout (30 seconds to connect, 30 to read) or a TLS error is\nretried; a `4xx`, a redirect — which is never followed — and an expired TLS certificate\nare final and are not.\n\nThere are eleven retries after the first attempt, spaced 1 minute, 2, 4, 8, 15, 30\nminutes, then 1, 2, 4, 6 and 10 hours, so the last one lands about 24 hours after the\nevent. Those gaps are the earliest a retry is made, not the exact moment: a retry can\nrun up to a minute later.\n\nDeliveries to one host are made one at a time, so a slow endpoint delays its own queue.\nA webhook whose oldest unresolved failure is 72 hours old is deactivated — `is_active`\nbecomes false, the account is notified by email, and the pending deliveries for that\nhost are dropped. A `4xx` starts that clock as surely as a `5xx` does.\n\n## Order\n\nDeliveries are not ordered: a delivery retried after a failure arrives after ones raised\nlater, so a payload can describe a state older than the one before it. Treat a delivery\nas a signal that something changed rather than as the change itself, and read the\ncurrent state back through the API — `GET /booking_revisions/{id}` for a booking event,\nthe availability and restrictions endpoints for an `ari` one."
    },
    {
      "name": "Webhook Signing Keys",
      "description": "HMAC keys that sign webhook deliveries, so that a receiving endpoint can tell that a\ncallback came from Channex and that its body was not altered on the way.\n\nA key is a shared secret: Channex holds it and so do you. It is not an API credential\n— it authenticates nothing against this API and grants no access. It is used in one\ndirection only, on the callbacks Channex sends to you.\n\nA key belongs to a billing account and holds up to two secret versions — the current\none plus an optional pending one, which is what makes rotation zero-downtime. To turn\nsigning on, point a webhook at the key with `signing_key_id` and set `is_signed`.\n\n## What is signed\n\nEvery delivery of a signed webhook — the `POST` Channex makes to the webhook's\n`callback_url` — carries three headers:\n\n- `x-hmac-timestamp` — Unix timestamp (seconds) taken when the delivery was signed.\n- `x-hmac-signature-256` — comma-separated lowercase-hex HMAC-SHA256 signatures, one\n  per secret version of the key, the current version first.\n- `x-hmac-keys-256` — comma-separated version labels (`...` followed by each secret's\n  last 6 characters), in the same order as the signatures.\n\nEach signature is computed over the string `{timestamp}.{raw request body}`: the value\nof `x-hmac-timestamp`, a dot, and the exact bytes of that delivery's body. Nothing else\nenters it — neither the callback URL nor the webhook's `request_params` and `headers`.\n\n## Verifying a delivery\n\nRecompute HMAC-SHA256 over `{timestamp}.{raw body}` with your stored secret, then\ncompare it against the signature at the position whose label in `x-hmac-keys-256` ends\nwith your secret's last 6 characters.\n\n## Rotating a key\n\n`generate` adds a pending secret version beside the current one, and deliveries are\nthen signed with both — so verification against the current secret keeps working while\nthe new secret is stored on your side. `rotate` promotes the newest version to be the\nsole current version, after which deliveries carry its signature alone."
    },
    {
      "name": "Applications",
      "description": "Applications extending Channex (PCI, Messages, payment and PMS integrations): the available catalog and per-property installations."
    },
    {
      "name": "Payment App",
      "description": "Payment Application actions: connect and manage payment providers, report on transactions, and export them to CSV."
    },
    {
      "name": "Stripe Tokenization App",
      "description": "Stripe Tokenization Application actions: tokenize a booking's card into a Stripe token or payment method."
    },
    {
      "name": "Authorize.net App",
      "description": "Authorize.net Application actions: tokenize a booking's card into an Authorize.net customer profile."
    },
    {
      "name": "Authentication",
      "description": "User accounts and sessions: sign-up and confirmation, sign-in with multi-factor verification, OAuth session exchange, token refresh, sign-out, and password recovery."
    }
  ],
  "paths": {
    "/applications": {
      "get": {
        "operationId": "ApplicationCatalog_list",
        "summary": "List available applications",
        "description": "List the applications available for installation.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Applications.ApplicationResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Applications"
        ]
      }
    },
    "/applications/install": {
      "post": {
        "operationId": "ApplicationLifecycle_install",
        "summary": "Install an application",
        "description": "Install an application on a Property. Name the application by\n`application_id` or by `application_code`; the response carries the new\ninstallation with the application's own default settings and `is_active`\nset.\n\nA Property may hold only one installation of the same application: a second\none is refused. An `application_code` or `application_id` that names no\napplication answers `404`; a `property_id` that names no Property is\nrefused. A body naming neither `application_id` nor `application_code`, and\na body carrying no `property_id`, are refused the same way.\n\nThe caller must be entitled to install — an account owner, an admin or an\nAPI key — and must reach the Property; an application restricted to\nProperty owners also requires the `owner` role. A caller failing either\ncheck is refused with `403`.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Applications.ApplicationInstallationResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Applications"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Applications.ApplicationInstallationCreateRequest"
              }
            }
          }
        }
      }
    },
    "/applications/installed": {
      "get": {
        "operationId": "InstalledApplications_installed",
        "summary": "List installed applications",
        "description": "List the caller's active application installations across their Properties.\n\nAn installation whose `is_active` is `false` is left out. Items carry their\nrate-plan mappings inside `attributes.relationships`, and neither the\ninstall time nor the active flag.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Applications.InstalledApplicationResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Applications"
        ]
      }
    },
    "/applications/payment_app/{installation_id}/connect": {
      "post": {
        "operationId": "PaymentApp_connect",
        "summary": "Connect a payment provider",
        "description": "Start connecting a payment provider: the response carries a link to the provider's own connection flow.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentApp.ConnectLinkDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentApp.ConnectRequest"
              }
            }
          }
        }
      }
    },
    "/applications/payment_app/{installation_id}/disconnect": {
      "post": {
        "operationId": "PaymentApp_disconnect",
        "summary": "Disconnect a payment provider",
        "description": "Disconnect a payment provider.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentApp.SuccessFlagDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentApp.DisconnectRequest"
              }
            }
          }
        }
      }
    },
    "/applications/payment_app/{installation_id}/download_csv": {
      "post": {
        "operationId": "PaymentAppTransactions_downloadCsv",
        "summary": "Download a transactions export",
        "description": "Download a requested transactions export as a CSV file.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Transactions export: the CSV file the export token names.",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentApp.DownloadCsvRequest"
              }
            }
          }
        }
      }
    },
    "/applications/payment_app/{installation_id}/export_csv": {
      "post": {
        "operationId": "PaymentAppTransactions_exportCsv",
        "summary": "Request a transactions export",
        "description": "Request a CSV export of payment transactions, selected by the same filters\nthe listing takes. The response carries a token; pass it to the download\nendpoint to fetch the file.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "name": "filter[booking_id]",
            "in": "query",
            "required": false,
            "description": "Return only transactions of the given booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[payment_provider_id]",
            "in": "query",
            "required": false,
            "description": "Return only transactions processed by the given payment provider.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[status]",
            "in": "query",
            "required": false,
            "description": "Return only transactions of the given kind.",
            "schema": {
              "$ref": "#/components/schemas/BookingPayments.PaymentTransactionType"
            },
            "explode": false
          },
          {
            "name": "filter[inserted_at][lte]",
            "in": "query",
            "required": false,
            "description": "Return only transactions inserted at or before the given time.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "explode": false
          },
          {
            "name": "filter[inserted_at][gte]",
            "in": "query",
            "required": false,
            "description": "Return only transactions inserted at or after the given time.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentApp.ExportTokenDocument"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ]
      }
    },
    "/applications/payment_app/{installation_id}/providers": {
      "post": {
        "operationId": "PaymentApp_providers",
        "summary": "List payment providers",
        "description": "List the payment providers connected on the installation.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/PaymentApp.PaymentProviderListParams.filterProvider"
          },
          {
            "$ref": "#/components/parameters/PaymentApp.PaymentProviderListParams.filterIsActive"
          },
          {
            "$ref": "#/components/parameters/PaymentApp.PaymentProviderListParams.filterIsDefault"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentApp.PaymentProvidersDocument"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ]
      }
    },
    "/applications/payment_app/{installation_id}/set_provider_as_default": {
      "post": {
        "operationId": "PaymentApp_setProviderAsDefault",
        "summary": "Set the default payment provider",
        "description": "Make a payment provider connection the default one; every other connection becomes non-default.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentApp.PaymentProvidersDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentApp.SetDefaultProviderRequest"
              }
            }
          }
        }
      }
    },
    "/applications/payment_app/{installation_id}/transactions": {
      "post": {
        "operationId": "PaymentAppTransactions_transactions",
        "summary": "List payment transactions",
        "description": "List the payment transactions the installation's providers processed.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "$ref": "#/components/parameters/PaymentApp.PaymentTransactionListParams.booking_id"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/PaymentApp.PaymentTransactionListParams.orderInsertedAt"
          },
          {
            "name": "filter[booking_id]",
            "in": "query",
            "required": false,
            "description": "Return only transactions of the given booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[payment_provider_id]",
            "in": "query",
            "required": false,
            "description": "Return only transactions processed by the given payment provider.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[status]",
            "in": "query",
            "required": false,
            "description": "Return only transactions of the given kind.",
            "schema": {
              "$ref": "#/components/schemas/BookingPayments.PaymentTransactionType"
            },
            "explode": false
          },
          {
            "name": "filter[inserted_at][lte]",
            "in": "query",
            "required": false,
            "description": "Return only transactions inserted at or before the given time.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "explode": false
          },
          {
            "name": "filter[inserted_at][gte]",
            "in": "query",
            "required": false,
            "description": "Return only transactions inserted at or after the given time.",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentApp.TransactionListDocument"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ]
      }
    },
    "/applications/payment_app/{installation_id}/update_provider": {
      "put": {
        "operationId": "PaymentApp_updateProvider",
        "summary": "Update a payment provider",
        "description": "Update a payment provider connection. Only its title can be changed.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Payment Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentApp.PaymentProvidersDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Payment App"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentApp.UpdateProviderRequest"
              }
            }
          }
        }
      }
    },
    "/applications/stripe_tokenization_app/{installation_id}/payment_method": {
      "post": {
        "operationId": "StripeTokenizationApp_paymentMethod",
        "summary": "Create a Stripe payment method",
        "description": "Create a Stripe payment method for the booking's card.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Stripe Tokenization Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StripeTokenizationApp.StripePaymentMethodDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "Stripe Tokenization App"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StripeTokenizationApp.TokenizeCardRequest"
              }
            }
          }
        }
      }
    },
    "/applications/stripe_tokenization_app/{installation_id}/token": {
      "post": {
        "operationId": "StripeTokenizationApp_token",
        "summary": "Create a Stripe token",
        "description": "Create a Stripe token for the booking's card.",
        "parameters": [
          {
            "name": "installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the Stripe Tokenization Application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StripeTokenizationApp.StripeTokenDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "Stripe Tokenization App"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StripeTokenizationApp.TokenizeCardRequest"
              }
            }
          }
        }
      }
    },
    "/applications/{application_installation_id}/uninstall": {
      "delete": {
        "operationId": "ApplicationLifecycle_uninstall",
        "summary": "Uninstall an application",
        "description": "Uninstall an application from a Property. The installation and its\nrate-plan mappings are removed; uninstalling it again answers `404`.",
        "parameters": [
          {
            "name": "application_installation_id",
            "in": "path",
            "required": true,
            "description": "UUID of the application installation.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Applications"
        ]
      }
    },
    "/availability": {
      "get": {
        "operationId": "AriAvailability_listAvailability",
        "summary": "Read availability",
        "description": "Read the real availability per Room Type and date, before any rate-plan\nmodifier is applied. The answer maps each Room Type of the Property to its\ndates, and each date to the number of rooms left to sell.\n\nThe dates come from either a single `filter[date]` or the range\n`filter[date][gte]`–`filter[date][lte]`. Both the Property and the dates are\nrequired. A Property the credentials cannot reach yields an empty `data`\nobject rather than `403 Forbidden` or `404 Not Found`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Restrictions.AvailabilityListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Restrictions.AvailabilityListParams.date"
          },
          {
            "$ref": "#/components/parameters/Restrictions.AvailabilityListParams.dateGte"
          },
          {
            "$ref": "#/components/parameters/Restrictions.AvailabilityListParams.dateLte"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Restrictions.AvailabilityDocument"
                },
                "examples": {
                  "Three dates of one room type": {
                    "summary": "Three dates of one room type",
                    "description": "The rooms left to sell on each date of a three-day range.",
                    "value": {
                      "data": {
                        "994d1375-dbbd-4072-8724-b2ab32ce781b": {
                          "2026-10-01": 5,
                          "2026-10-02": 5,
                          "2026-10-03": 0
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request has missing or invalid arguments; `details` lists the reasons.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.BadRequestWithReasons"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "ARI"
        ]
      },
      "post": {
        "operationId": "AriAvailability_updateAvailability",
        "summary": "Update availability",
        "description": "Update the availability of specific Room Types and dates. Each change object\ncarries the Property and the Room Type it applies to, and targets either a\nsingle `date` or the range `date_from`–`date_to`, optionally narrowed to\nspecific `days`.\n\nChanges are applied asynchronously: `data` carries one background task\nreference per Property, and the new count is readable a moment later rather\nthan at once. See the Tasks resource to follow a task to completion.\n\nThe availability written here is what every Rate Plan of the Room Type reads\nback: the `availability` of a Rate Plan is derived from it and cannot be set\ndirectly.\n\nA change object that fails validation is rejected on its own and reported\nunder `meta.warnings` while the others are still applied — such a response is\nstill `200 OK`, and `data` is empty only when every change object was\nrejected.\n\nRate limited to ten requests a minute per Property. Rate and restriction\nupdates carry a limit of ten a minute of their own, so twenty ARI updates a\nminute per Property in all; beyond that the request answers `429 Too Many\nRequests`, and nothing is applied until the limit expires.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Restrictions.UpdateAcknowledgement"
                },
                "examples": {
                  "A single date and a weekend range": {
                    "summary": "A single date and a weekend range",
                    "description": "One date set outright, and a month-long range narrowed to Saturdays and Sundays.",
                    "value": {
                      "data": [
                        {
                          "id": "eb31d631-4fcc-478a-80c3-bf7a2acf0699",
                          "type": "task"
                        }
                      ],
                      "meta": {
                        "message": "Success"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          },
          "429": {
            "description": "The client has sent too many requests and is being rate limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.TooManyRequests"
                }
              }
            }
          }
        },
        "tags": [
          "ARI"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Restrictions.AvailabilityUpdateRequest"
              },
              "examples": {
                "A single date and a weekend range": {
                  "summary": "A single date and a weekend range",
                  "description": "One date set outright, and a month-long range narrowed to Saturdays and Sundays.",
                  "value": {
                    "values": [
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "room_type_id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                        "date": "2026-10-01",
                        "availability": 5
                      },
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "room_type_id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                        "date_from": "2026-10-02",
                        "date_to": "2026-10-31",
                        "days": [
                          "sa",
                          "su"
                        ],
                        "availability": 2
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/booking_revisions": {
      "get": {
        "operationId": "BookingRevisions_list",
        "summary": "List booking revisions",
        "description": "List booking revisions associated with the user's properties.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/BookingRevisions.BookingRevisionListParams.orderInsertedAt"
          },
          {
            "$ref": "#/components/parameters/BookingRevisions.BookingRevisionListParams.filterPropertyId"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "type",
                          "id",
                          "attributes",
                          "relationships"
                        ],
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "booking_revision"
                            ]
                          },
                          "id": {
                            "$ref": "#/components/schemas/Common.Scalars.id"
                          },
                          "attributes": {
                            "$ref": "#/components/schemas/BookingRevisions.BookingRevision"
                          },
                          "relationships": {
                            "$ref": "#/components/schemas/BookingRevisions.BookingRevisionRelationships"
                          }
                        },
                        "description": "A JSON:API resource object with typed attributes and relationships."
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Bookings"
        ]
      }
    },
    "/booking_revisions/feed": {
      "get": {
        "operationId": "BookingRevisions_feed",
        "summary": "Pull the feed of unacknowledged revisions",
        "description": "Feed of not yet acknowledged booking revisions — the primary way to pull bookings from Channex. Acknowledge every received revision via `ack`; an unacknowledged revision keeps being served for 30 minutes, after which a warning email is sent. Returns an empty list when everything is acknowledged.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/BookingRevisions.BookingRevisionFeedParams.orderInsertedAt"
          },
          {
            "$ref": "#/components/parameters/BookingRevisions.BookingRevisionFeedParams.filterPropertyId"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "type",
                          "id",
                          "attributes",
                          "relationships"
                        ],
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "booking_revision"
                            ]
                          },
                          "id": {
                            "$ref": "#/components/schemas/Common.Scalars.id"
                          },
                          "attributes": {
                            "$ref": "#/components/schemas/BookingRevisions.BookingRevision"
                          },
                          "relationships": {
                            "$ref": "#/components/schemas/BookingRevisions.BookingRevisionRelationships"
                          }
                        },
                        "description": "A JSON:API resource object with typed attributes and relationships."
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Bookings"
        ]
      }
    },
    "/booking_revisions/{id}": {
      "get": {
        "operationId": "BookingRevisions_read",
        "summary": "Retrieve a booking revision",
        "description": "Retrieve a specific booking revision by ID.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "type",
                        "id",
                        "attributes",
                        "relationships"
                      ],
                      "properties": {
                        "type": {
                          "type": "string",
                          "enum": [
                            "booking_revision"
                          ]
                        },
                        "id": {
                          "$ref": "#/components/schemas/Common.Scalars.id"
                        },
                        "attributes": {
                          "$ref": "#/components/schemas/BookingRevisions.BookingRevision"
                        },
                        "relationships": {
                          "$ref": "#/components/schemas/BookingRevisions.BookingRevisionRelationships"
                        }
                      },
                      "description": "A JSON:API resource object with typed attributes and relationships."
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Bookings"
        ]
      }
    },
    "/booking_revisions/{id}/ack": {
      "post": {
        "operationId": "BookingRevisionAcknowledgements_ack",
        "summary": "Acknowledge a booking revision",
        "description": "Confirm receiving a booking revision by creating an acknowledge record. The revision stops appearing in the feed.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Bookings"
        ]
      }
    },
    "/bookings": {
      "get": {
        "operationId": "Bookings_list",
        "summary": "List bookings",
        "description": "List bookings associated with the user's properties.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/Bookings.BookingListParams.orderInsertedAt"
          },
          {
            "$ref": "#/components/parameters/Bookings.BookingListParams.arrivalDateGte"
          },
          {
            "$ref": "#/components/parameters/Bookings.BookingListParams.arrivalDateLte"
          },
          {
            "$ref": "#/components/parameters/Bookings.BookingListParams.departureDateGte"
          },
          {
            "$ref": "#/components/parameters/Bookings.BookingListParams.departureDateLte"
          },
          {
            "$ref": "#/components/parameters/Bookings.BookingListParams.insertedAtGte"
          },
          {
            "$ref": "#/components/parameters/Bookings.BookingListParams.insertedAtLte"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Bookings.BookingResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Bookings"
        ]
      },
      "post": {
        "operationId": "BookingCrs_create",
        "summary": "Create a booking",
        "description": "Create a booking. Requires the Booking CRS application installed on the Property; the Booking CRS API is in beta and may change. The operation is asynchronous: a request for the booking immediately after the response can return `404 Not Found`. Creation follows the regular booking pipeline and triggers the associated webhooks and availability changes, depending on the Property settings.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Bookings.BookingShortResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking CRS"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookings.BookingCreateRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/authorize_net_customer": {
      "post": {
        "operationId": "BookingAuthorizeNet_createCustomer",
        "summary": "Create an Authorize.net customer profile",
        "description": "Tokenize the booking's card into a reusable Authorize.net customer profile.\nRequires the Authorize.net Application installed on the booking's Property;\nwithout it the request answers `403 Forbidden`.\n\nSend `billing_details` only when the Property's Authorize.net account\nrequires them.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking whose card to tokenize.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthorizeNet.AuthorizeNetCustomerDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Authorize.net App"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AuthorizeNet.AuthorizeNetCustomerRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/charge_payment": {
      "post": {
        "operationId": "BookingPayments_charge",
        "summary": "Charge a payment",
        "description": "Charge an amount on the booking's payment method.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingPayments.PaymentDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payments"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingPayments.PaymentAmountRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/messages": {
      "get": {
        "operationId": "BookingMessages_list",
        "summary": "List the messages of a booking",
        "description": "List the messages of a booking. Results are paginated and ordered by receive time.\n\nA booking whose conversation has not been seen before is fetched from the provider as the\nrequest is handled, so a provider that has no messaging refuses the request.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/BookingMessages.BookingMessageListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MessageThreads.MessageListResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.NotSupported"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Messages"
        ]
      },
      "post": {
        "operationId": "BookingMessages_send",
        "summary": "Send a message to a booking",
        "description": "Send a message to a booking. The message is passed to the provider as the request is\nhandled, so a provider that refuses it refuses the request. A booking with no channel —\none created through the Bookings endpoint, say — cannot carry messages. A provider rate\nlimit answers 429 with a `Retry-After` header. The provider did not take the message, so\nsend it again after that delay.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MessageThreads.MessageResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.UnprocessableEntity"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.NotSupported"
                    }
                  ]
                }
              }
            }
          },
          "429": {
            "description": "The client has sent too many requests and is being rate limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.TooManyRequests"
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Messages"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MessageThreads.MessageCreateRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/messages/pull": {
      "post": {
        "operationId": "BookingMessages_pull",
        "summary": "Pull the messages of a booking",
        "description": "Fetch the booking's conversation from the provider and store what is new. Answers the\nthread's messages — the ones already held as well as the ones just pulled — as a plain\nlist, without pagination. Takes no request body.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MessageThreads.MessageResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.UnprocessableEntity"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.NotSupported"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Messages"
        ]
      }
    },
    "/bookings/{booking_id}/payments": {
      "get": {
        "operationId": "BookingPayments_list",
        "summary": "List the payments of a booking",
        "description": "List the payments of a booking. Requires the Payments application installed on the Property; without it the request answers `403 Forbidden`.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/BookingPayments.PaymentListParams.orderInsertedAt"
          },
          {
            "$ref": "#/components/parameters/BookingPayments.PaymentListParams.filterPaymentProviderId"
          },
          {
            "$ref": "#/components/parameters/BookingPayments.PaymentListParams.filterStatus"
          },
          {
            "$ref": "#/components/parameters/BookingPayments.PaymentListParams.filterInsertedAtLte"
          },
          {
            "$ref": "#/components/parameters/BookingPayments.PaymentListParams.filterInsertedAtGte"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingPayments.PaymentListDocument"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payments"
        ]
      }
    },
    "/bookings/{booking_id}/pre_auth_payment": {
      "post": {
        "operationId": "BookingPayments_preAuth",
        "summary": "Pre-authorize a payment",
        "description": "Pre-authorize an amount on the booking's payment method: place a hold to be settled via `POST /bookings/{booking_id}/settle_payment` or released via `POST /bookings/{booking_id}/void_payment`.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingPayments.PaymentDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payments"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingPayments.PaymentAmountRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/refund_payment": {
      "post": {
        "operationId": "BookingPayments_refund",
        "summary": "Refund a payment",
        "description": "Refund a charged payment, fully or partially.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingPayments.PaymentDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payments"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingPayments.RefundPaymentRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/settle_payment": {
      "post": {
        "operationId": "BookingPayments_settle",
        "summary": "Settle a pre-authorized payment",
        "description": "Settle a pre-authorized payment: capture the held amount.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingPayments.PaymentDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payments"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingPayments.PaymentIdRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/stripe_payment_method": {
      "post": {
        "operationId": "BookingStripeTokenization_bookingPaymentMethod",
        "summary": "Create a Stripe payment method for a booking",
        "description": "Create a Stripe payment method for the booking's card. Requires the Stripe\nTokenization Application installed on the booking's Property; without it\nthe request answers `403 Forbidden`.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking whose card to tokenize.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StripeTokenizationApp.StripePaymentMethodDocument"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Stripe Tokenization App"
        ]
      }
    },
    "/bookings/{booking_id}/stripe_token": {
      "post": {
        "operationId": "BookingStripeTokenization_bookingToken",
        "summary": "Create a Stripe token for a booking",
        "description": "Create a Stripe token for the booking's card. Requires the Stripe\nTokenization Application installed on the booking's Property; without it\nthe request answers `403 Forbidden`.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking whose card to tokenize.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StripeTokenizationApp.StripeTokenDocument"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Stripe Tokenization App"
        ]
      }
    },
    "/bookings/{booking_id}/void_payment": {
      "post": {
        "operationId": "BookingPayments_void",
        "summary": "Void a pre-authorized payment",
        "description": "Void a pre-authorized payment: release the held amount without charging.",
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "description": "UUID of the booking.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingPayments.PaymentDocument"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payments"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingPayments.PaymentIdRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{id}": {
      "get": {
        "operationId": "Bookings_read",
        "summary": "Retrieve a booking",
        "description": "Retrieve a booking by ID. Returns the details of the booking's latest revision.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Bookings.BookingResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Bookings"
        ]
      },
      "put": {
        "operationId": "BookingCrs_update",
        "summary": "Update a booking",
        "description": "Update a booking — including bookings that originated at an OTA. Requires the Booking CRS application installed on the Property; the Booking CRS API is in beta and may change. Once a booking has revisions created through this API, later OTA modifications are applied diff-based: only the fields the OTA actually changed overwrite your values. Triggers the associated webhooks and availability changes, depending on the Property settings.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Bookings.BookingShortResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking CRS"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookings.BookingUpdateRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{id}/bank_transfer_payout": {
      "get": {
        "operationId": "BookingPayouts_bankTransferPayout",
        "summary": "Retrieve the bank transfer payout of a booking",
        "description": "Retrieve the bank-transfer payouts of a Booking.com booking: the amount, scheduled date, and status of each bank transfer. The data is requested from Booking.com and returned in Booking.com's response format — see [Getting BT payout details for reservation](https://developers.booking.com/connectivity/docs/payments-api/managing-payment-and-payout-details#getting-bt-payout-details-for-reservation) in the Booking.com Connectivity documentation. Supported for Booking.com bookings. Errors reported by Booking.com are relayed with status `200 OK` and appear in the `errors` array.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "errors",
                    "meta",
                    "warnings"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Bookings.BookingComBankTransferPayout"
                    },
                    "errors": {
                      "type": "array",
                      "items": {},
                      "description": "Errors reported by Booking.com. Empty on success."
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "ruid": {
                          "type": "string",
                          "description": "Booking.com request trace identifier.",
                          "examples": [
                            "d828ebd4-1732-4d0f-89ab-5c6b182e84ef"
                          ]
                        }
                      },
                      "required": [
                        "ruid"
                      ]
                    },
                    "warnings": {
                      "type": "array",
                      "items": {},
                      "description": "Warnings reported by Booking.com. Empty when there are none."
                    }
                  },
                  "description": "Response envelope of the Booking.com payments endpoints. Errors reported by Booking.com are relayed with status `200 OK` and appear in `errors`."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payouts"
        ]
      }
    },
    "/bookings/{id}/cancel_due_invalid_card": {
      "post": {
        "operationId": "BookingOtaReports_cancelDueInvalidCard",
        "summary": "Cancel a booking over invalid card details",
        "description": "Cancel the booking because of invalid credit card details. Available when the guest has not provided valid card details within the allowed update window after an invalid-card report: usually 24 hours; 12 hours or until 3 pm (whichever is earlier) for bookings made within 48 hours of check-in; always at least 2 hours. Supported for Booking.com bookings. Takes an empty request body.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The operation is not supported for this resource — e.g. the booking's OTA does not support the Reporting API.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.MethodNotSupported"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Reporting"
        ]
      }
    },
    "/bookings/{id}/guest_misconduct": {
      "post": {
        "operationId": "BookingOtaReports_guestMisconduct",
        "summary": "Report guest misconduct",
        "description": "Report guest misconduct to the OTA — for example a payment issue or damage caused by the guest. The available categories and subcategories, and the additional damage fields some categories accept, are listed by `GET /channels/{channel_id}/action/misconduct_categories`. Booking.com accepts misconduct reports from the check-in date up to 7 days after check-out; errors reported by Booking.com are relayed as validation errors. Supported for Booking.com bookings.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Reporting"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookings.GuestMisconductRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{id}/invalid_card": {
      "post": {
        "operationId": "BookingOtaReports_invalidCard",
        "summary": "Report an invalid credit card",
        "description": "Report the booking's credit card as invalid to the OTA. Available immediately after the reservation is made, up until midnight (00:00) on the day of check-in, in the property's local timezone. Supported for Booking.com bookings. Takes an empty request body.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The operation is not supported for this resource — e.g. the booking's OTA does not support the Reporting API.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.MethodNotSupported"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Reporting"
        ]
      }
    },
    "/bookings/{id}/no_show": {
      "post": {
        "operationId": "BookingOtaReports_noShow",
        "summary": "Report a guest no-show",
        "description": "Report a guest no-show to the OTA. Available from 00:00 (midnight, property-local time) on the planned check-in date, up to 48 hours later, provided the reservation's status allows modifications and the reservation is not overbooked. Supported for Booking.com and Expedia bookings.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The operation is not supported for this resource — e.g. the booking's OTA does not support the Reporting API.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.MethodNotSupported"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Booking Reporting"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookings.NoShowReportRequest"
              }
            }
          }
        }
      }
    },
    "/bookings/{id}/payout_details": {
      "get": {
        "operationId": "BookingPayouts_payoutDetails",
        "summary": "Retrieve the payout details of a booking",
        "description": "Retrieve the payout details of a Booking.com booking: the overall payout status, the scheduled payouts per payment method, the partner payout summary, and the commissions and charges per room reservation. The data is requested from Booking.com and returned in Booking.com's response format — see [Getting payout details for reservation](https://developers.booking.com/connectivity/docs/payments-api/managing-payment-and-payout-details#getting-payout-details-for-reservation) in the Booking.com Connectivity documentation. Supported for Booking.com bookings. Errors reported by Booking.com are relayed with status `200 OK` and appear in the `errors` array.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "errors",
                    "meta",
                    "warnings"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Bookings.BookingComPayoutDetails"
                    },
                    "errors": {
                      "type": "array",
                      "items": {},
                      "description": "Errors reported by Booking.com. Empty on success."
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "ruid": {
                          "type": "string",
                          "description": "Booking.com request trace identifier.",
                          "examples": [
                            "d828ebd4-1732-4d0f-89ab-5c6b182e84ef"
                          ]
                        }
                      },
                      "required": [
                        "ruid"
                      ]
                    },
                    "warnings": {
                      "type": "array",
                      "items": {},
                      "description": "Warnings reported by Booking.com. Empty when there are none."
                    }
                  },
                  "description": "Response envelope of the Booking.com payments endpoints. Errors reported by Booking.com are relayed with status `200 OK` and appear in `errors`."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payouts"
        ]
      }
    },
    "/bookings/{id}/price_breakdown": {
      "get": {
        "operationId": "BookingPayouts_priceBreakdown",
        "summary": "Retrieve the price breakdown of a booking",
        "description": "Retrieve the price breakdown of a Booking.com booking: the partner payout summary, the reservation totals, and the commissions and charges per room reservation. The data is requested from Booking.com and returned in Booking.com's response format — see [Getting price breakdown for reservation](https://developers.booking.com/connectivity/docs/payments-api/managing-payment-and-payout-details#getting-price-breakdown-for-reservation) in the Booking.com Connectivity documentation. Supported for Booking.com bookings. Errors reported by Booking.com are relayed with status `200 OK` and appear in the `errors` array.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "errors",
                    "meta",
                    "warnings"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Bookings.BookingComPriceBreakdown"
                    },
                    "errors": {
                      "type": "array",
                      "items": {},
                      "description": "Errors reported by Booking.com. Empty on success."
                    },
                    "meta": {
                      "type": "object",
                      "properties": {
                        "ruid": {
                          "type": "string",
                          "description": "Booking.com request trace identifier.",
                          "examples": [
                            "d828ebd4-1732-4d0f-89ab-5c6b182e84ef"
                          ]
                        }
                      },
                      "required": [
                        "ruid"
                      ]
                    },
                    "warnings": {
                      "type": "array",
                      "items": {},
                      "description": "Warnings reported by Booking.com. Empty when there are none."
                    }
                  },
                  "description": "Response envelope of the Booking.com payments endpoints. Errors reported by Booking.com are relayed with status `200 OK` and appear in `errors`."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Payouts"
        ]
      }
    },
    "/bookings/{id}/stay_change": {
      "post": {
        "operationId": "BookingOtaReports_stayChange",
        "summary": "Report a change of stay",
        "description": "Report stay changes for the rooms of a booking to the OTA — a new checkout date, a new price, or both, per room. Values omitted from a report keep the room's current values; the check-in date cannot be changed. Errors reported by the OTA are relayed as validation errors. Supported for Booking.com bookings.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Reporting"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Bookings.StayChangeRequest"
              }
            }
          }
        }
      }
    },
    "/channel_availability_rules": {
      "get": {
        "operationId": "ChannelAvailabilityRules_list",
        "summary": "List availability rules",
        "description": "List availability rules. Results are paginated, 10 per page by default, and ordered\nby creation time ascending unless `order[…]` says otherwise; the `meta` block carries\nthe page, limit, total and ordering.",
        "parameters": [
          {
            "name": "filter[property_id]",
            "in": "query",
            "required": false,
            "description": "Return only rules of this property.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[type]",
            "in": "query",
            "required": false,
            "description": "Return only rules of this type.",
            "schema": {
              "$ref": "#/components/schemas/ChannelAvailabilityRules.AvailabilityRuleType"
            },
            "explode": false
          },
          {
            "name": "order[inserted_at]",
            "in": "query",
            "required": false,
            "description": "Order rules by creation time. Applied by default, ascending.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[title]",
            "in": "query",
            "required": false,
            "description": "Order rules by title.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[type]",
            "in": "query",
            "required": false,
            "description": "Order rules by type.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Channel Availability Rules"
        ]
      },
      "post": {
        "operationId": "ChannelAvailabilityRules_create",
        "summary": "Create an availability rule",
        "description": "Create an availability rule. `type`, `start_date` and at least one channel and room\ntype are required, as is `value` for the two types that use it; `end_date`, when\ngiven, must be later than `start_date`, and the title defaults to the name of the\ntype. The created rule is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Channel Availability Rules"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleCreateRequest"
              }
            }
          }
        }
      }
    },
    "/channel_availability_rules/options": {
      "get": {
        "operationId": "ChannelAvailabilityRules_options",
        "summary": "List availability rule options",
        "description": "List availability rules as lightweight items for selectors — every read attribute\nexcept `value`, and no relationships. Filtered and ordered like `list`, but not\npaginated: every matching rule comes back in one response.",
        "parameters": [
          {
            "name": "filter[property_id]",
            "in": "query",
            "required": false,
            "description": "Return only rules of this property.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[type]",
            "in": "query",
            "required": false,
            "description": "Return only rules of this type.",
            "schema": {
              "$ref": "#/components/schemas/ChannelAvailabilityRules.AvailabilityRuleType"
            },
            "explode": false
          },
          {
            "name": "order[inserted_at]",
            "in": "query",
            "required": false,
            "description": "Order rules by creation time. Applied by default, ascending.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[title]",
            "in": "query",
            "required": false,
            "description": "Order rules by title.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[type]",
            "in": "query",
            "required": false,
            "description": "Order rules by type.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleOption"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Channel Availability Rules"
        ]
      }
    },
    "/channel_availability_rules/{id}": {
      "get": {
        "operationId": "ChannelAvailabilityRules_read",
        "summary": "Retrieve an availability rule",
        "description": "Retrieve an availability rule by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Channel Availability Rules"
        ]
      },
      "put": {
        "operationId": "ChannelAvailabilityRules_update",
        "summary": "Update an availability rule",
        "description": "Update an availability rule by its identifier. Attributes absent from the request are\nleft unchanged, and `property_id` is ignored — a rule stays with its property. The\nupdated rule is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Channel Availability Rules"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "ChannelAvailabilityRules_delete",
        "summary": "Delete an availability rule",
        "description": "Delete an availability rule by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Channel Availability Rules"
        ]
      }
    },
    "/channels/{channel_id}/action/misconduct_categories": {
      "get": {
        "operationId": "GuestMisconductCategories_list",
        "summary": "List guest misconduct categories",
        "description": "List the guest misconduct categories of a channel: for each category its identifier, title, subcategories, and the additional damage fields a report in that category accepts, with their allowed values. The category and subcategory identifiers are used to report guest misconduct on a booking — see `POST /bookings/{booking_id}/guest_misconduct`. The categories are requested from Booking.com; a fault reported by Booking.com is relayed with status `422`. Supported for Booking.com channels; other channels receive `400 Bad Request`.",
        "parameters": [
          {
            "name": "channel_id",
            "in": "path",
            "required": true,
            "description": "Channel ID.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Bookings.MisconductCategories"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request has missing or invalid arguments; `details` lists the reasons.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.BadRequestWithReasons"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The OTA rejected the request; `errors` relays the OTA's fault.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Channels.OtaFault"
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Booking Reporting"
        ]
      }
    },
    "/currencies": {
      "get": {
        "operationId": "ReferenceData_currencies",
        "summary": "List currencies",
        "description": "List all supported currencies. The whole list is returned; the endpoint is not paginated.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ReferenceData.Currency"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          }
        },
        "tags": [
          "Reference Data"
        ],
        "security": [
          {}
        ]
      }
    },
    "/group_users": {
      "get": {
        "operationId": "GroupUsers_list",
        "summary": "List group users",
        "description": "List the memberships of one group. `filter[group_id]` is required. Not paginated.",
        "parameters": [
          {
            "$ref": "#/components/parameters/GroupUsers.GroupUserListParams"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/GroupUsers.GroupUserResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Group Users"
        ]
      },
      "post": {
        "operationId": "GroupUsers_invite",
        "summary": "Invite a user into a group",
        "description": "Invite a user into a group, granting them access to every property in it. A user\nwithout a Channex account gets one, and an onboarding email. An address already\ninvited into the group is refused. The created membership is returned with\n`201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/GroupUsers.GroupUserResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Group Users"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GroupUsers.GroupUserCreateRequest"
              }
            }
          }
        }
      }
    },
    "/group_users/{id}": {
      "get": {
        "operationId": "GroupUsers_read",
        "summary": "Retrieve a group user",
        "description": "Retrieve a membership by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/GroupUsers.GroupUserResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Group Users"
        ]
      },
      "put": {
        "operationId": "GroupUsers_update",
        "summary": "Update a group user",
        "description": "Update a membership's role or access policy overrides. Attributes absent from the\nrequest are left unchanged. The updated membership is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/GroupUsers.GroupUserResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Group Users"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GroupUsers.GroupUserUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "GroupUsers_withdraw",
        "summary": "Withdraw a group user",
        "description": "Withdraw a user's access to the group. A user cannot withdraw their own access:\nthe request is refused with `400` and `details` naming the reason.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "400": {
            "description": "The request could not be processed in the current state; `details` explains why.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.BadRequestWithReason"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Group Users"
        ]
      }
    },
    "/groups": {
      "get": {
        "operationId": "Groups_list",
        "summary": "List groups",
        "description": "List groups. Results are paginated; the `meta` block carries the page, limit, total and ordering.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Groups.GroupListParams.title"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/Groups.GroupListParams.orderTitle"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Groups.GroupResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ]
      },
      "post": {
        "operationId": "Groups_create",
        "summary": "Create a group",
        "description": "Create a group. The created group is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Groups.GroupResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Groups.GroupCreateRequest"
              }
            }
          }
        }
      }
    },
    "/groups/options": {
      "get": {
        "operationId": "Groups_options",
        "summary": "List group options",
        "description": "List groups as lightweight `id` + `title` items for selectors. Not paginated.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "type",
                          "id",
                          "attributes"
                        ],
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "group"
                            ]
                          },
                          "id": {
                            "$ref": "#/components/schemas/Common.Scalars.id"
                          },
                          "attributes": {
                            "$ref": "#/components/schemas/Common.JsonApi.OptionAttributes"
                          }
                        },
                        "description": "A lightweight JSON:API resource returned by `/options` endpoints — id + title only, no relationships or pagination."
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ]
      }
    },
    "/groups/{id}": {
      "get": {
        "operationId": "Groups_read",
        "summary": "Retrieve a group",
        "description": "Retrieve a group by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Groups.GroupResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ]
      },
      "put": {
        "operationId": "Groups_update",
        "summary": "Update a group",
        "description": "Update a group by its identifier. Attributes absent from the request are left unchanged. The updated group is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Groups.GroupResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Groups.GroupUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "Groups_delete",
        "summary": "Delete a group",
        "description": "Delete a group by its identifier. A group that still holds properties is not deleted; remove them from the group first.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "400": {
            "description": "The request cannot be processed in the current state.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.BadRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ]
      }
    },
    "/groups/{id}/properties/{property_id}": {
      "post": {
        "operationId": "GroupPropertyMembership_addProperty",
        "summary": "Add a property to a group",
        "description": "Associate a property with the group. A property may belong to several groups at once; a property already in this group is refused.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "name": "property_id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ]
      },
      "delete": {
        "operationId": "GroupPropertyMembership_dropProperty",
        "summary": "Remove a property from a group",
        "description": "Remove a property from the group. A property must belong to at least one group, so a property that belongs to only one is not removed.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "name": "property_id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "400": {
            "description": "The request could not be processed in the current state; `details` explains why.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.BadRequestWithReason"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Groups"
        ]
      }
    },
    "/hotel_policies": {
      "get": {
        "operationId": "HotelPolicies_list",
        "summary": "List hotel policies",
        "description": "List the hotel policies of every property the credentials can access. Results are paginated, 10 per page by default, and ordered by title ascending unless `order[…]` says otherwise; the `meta` block carries the page, limit, total and ordering.",
        "parameters": [
          {
            "$ref": "#/components/parameters/HotelPolicies.HotelPolicyListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/HotelPolicies.HotelPolicyListParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/HotelPolicies.HotelPolicyListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/HotelPolicies.HotelPolicyResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Hotel Policies"
        ]
      },
      "post": {
        "operationId": "HotelPolicies_create",
        "summary": "Create a hotel policy",
        "description": "Create a hotel policy for a property. `property_id` must name a property the credentials can access; any other value is refused with `403 Forbidden`. The created policy is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/HotelPolicies.HotelPolicyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Hotel Policies"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HotelPolicies.HotelPolicyCreateRequest"
              }
            }
          }
        }
      }
    },
    "/hotel_policies/options": {
      "get": {
        "operationId": "HotelPolicies_options",
        "summary": "List hotel policy options",
        "description": "List hotel policies as lightweight `id` + `title` items for selectors, optionally narrowed to one property with `filter[property_id]`. Not paginated.",
        "parameters": [
          {
            "$ref": "#/components/parameters/HotelPolicies.HotelPolicyOptionsParams"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "type",
                          "id",
                          "attributes"
                        ],
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "hotel_policy"
                            ]
                          },
                          "id": {
                            "$ref": "#/components/schemas/Common.Scalars.id"
                          },
                          "attributes": {
                            "$ref": "#/components/schemas/Common.JsonApi.OptionAttributes"
                          }
                        },
                        "description": "A lightweight JSON:API resource returned by `/options` endpoints — id + title only, no relationships or pagination."
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Hotel Policies"
        ]
      }
    },
    "/hotel_policies/{id}": {
      "get": {
        "operationId": "HotelPolicies_read",
        "summary": "Retrieve a hotel policy",
        "description": "Retrieve a hotel policy by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/HotelPolicies.HotelPolicyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Hotel Policies"
        ]
      },
      "put": {
        "operationId": "HotelPolicies_update",
        "summary": "Update a hotel policy",
        "description": "Update a hotel policy by its identifier. Attributes absent from the request are left unchanged. The updated policy is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/HotelPolicies.HotelPolicyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Hotel Policies"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HotelPolicies.HotelPolicyUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "HotelPolicies_delete",
        "summary": "Delete a hotel policy",
        "description": "Delete a hotel policy by its identifier. A property that points at the policy through `hotel_policy_id` has the reference cleared to `null`.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Hotel Policies"
        ]
      }
    },
    "/live_feed": {
      "get": {
        "operationId": "LiveFeed_list",
        "summary": "List live feed events",
        "description": "List live feed events, most recent first. Results are paginated.",
        "parameters": [
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.channelId"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.channel"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.groupId"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.event"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.insertedAtFrom"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.insertedAtTo"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.payloadBookingId"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.payloadBookingUniqueId"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.payloadChannelId"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/LiveFeed.LiveFeedListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/LiveFeed.LiveFeedEventResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Live Feed"
        ]
      }
    },
    "/live_feed/{id}": {
      "get": {
        "operationId": "LiveFeed_read",
        "summary": "Retrieve a live feed event",
        "description": "Retrieve a live feed event by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LiveFeed.LiveFeedEventResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Live Feed"
        ]
      }
    },
    "/live_feed/{id}/resolve": {
      "post": {
        "operationId": "LiveFeed_resolve",
        "summary": "Resolve a live feed event",
        "description": "Resolve an actionable live feed event: answer the guest request it carries.\nApplicable to `reservation_request`, `alteration_request`, and `inquiry`\nevents; other event kinds are rejected with `422 not_supported`.\nResolving an already-resolved event returns it unchanged. Returns the event\nwith its `payload` updated with the resolution outcome.\n\nAccepting a reservation request emits `accepted_reservation` at once; the\nbooking itself arrives later as `booking_new`, once Airbnb confirms the\nstay. Declining emits `declined_reservation`.\n\nA pre-approval or special offer sent in answer to an inquiry gives the\nguest 24 hours to accept it and cannot be withdrawn through the API. When\nthe guest accepts, the reservation arrives as a regular new booking (a\n`booking_new` event); no event is emitted when an offer expires or is\ndeclined.\n\nAccepting an alteration request updates the existing booking with a new\nrevision (`booking_modification`) once Airbnb confirms the change.\nDeclining or cancelling one emits nothing — read the event again to confirm\nthe stored outcome.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LiveFeed.LiveFeedEventResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.NotSupported"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "A backing service is temporarily unavailable; retry the request later.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ServiceUnavailable"
                }
              }
            }
          }
        },
        "tags": [
          "Live Feed"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedResolutionRequest"
              }
            }
          }
        }
      }
    },
    "/photos": {
      "get": {
        "operationId": "Photos_list",
        "summary": "List photos",
        "description": "List the photos of every property the API key can access. Results are paginated; the `meta` block carries the page, limit, total and ordering.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Photos.PhotoListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Photos.PhotoListParams.roomTypeId"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/Photos.PhotoListParams.orderPosition"
          },
          {
            "$ref": "#/components/parameters/Photos.PhotoListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Photos.PhotoResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Photos"
        ]
      },
      "post": {
        "operationId": "Photos_create",
        "summary": "Create a photo",
        "description": "Attach an image to a property or one of its room types. The image is fetched and copied into Channex storage; the created photo is returned with `201 Created` and carries a placeholder `url` until the copy is stored — read the photo back for the final URL. Without `position` the photo is appended to the end of its list. A property holds at most 30 photos and each of its room types at most 10, counted separately; a request that would take a count past its limit is refused with `422 Unprocessable Entity` on `photos`, and deleting a photo frees its place.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Photos.PhotoResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Photos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Photos.PhotoCreateRequest"
              }
            }
          }
        }
      }
    },
    "/photos/upload": {
      "post": {
        "operationId": "PhotoUpload_upload",
        "summary": "Upload a photo file",
        "description": "Upload a photo file as the multipart part `photo`, returning a temporary URL to pass to create.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Photos.UploadResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Photos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Photos.PhotoUploadForm"
              },
              "encoding": {
                "photo": {
                  "contentType": "image/bmp, image/gif, image/jpeg, image/jp2, image/png, image/webp"
                }
              }
            }
          }
        }
      }
    },
    "/photos/{id}": {
      "get": {
        "operationId": "Photos_read",
        "summary": "Retrieve a photo",
        "description": "Retrieve a photo by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Photos.PhotoResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Photos"
        ]
      },
      "put": {
        "operationId": "Photos_update",
        "summary": "Update a photo",
        "description": "Update a photo by its identifier. Attributes absent from the request are left unchanged; `position` moves the photo within its list. The updated photo is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Photos.PhotoResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Photos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Photos.PhotoUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "Photos_delete",
        "summary": "Delete a photo",
        "description": "Delete a photo by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Photos"
        ]
      }
    },
    "/properties": {
      "get": {
        "operationId": "Properties_list",
        "summary": "List properties",
        "description": "List properties. Results are paginated; the `meta` block carries the page, limit, total and ordering. Without `pagination[…]` and `order[…]`, the first 10 properties are returned ordered by title ascending.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Properties.PropertyListParams.title"
          },
          {
            "$ref": "#/components/parameters/Properties.PropertyListParams.city"
          },
          {
            "$ref": "#/components/parameters/Properties.PropertyListParams.country"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/Properties.PropertyListParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/Properties.PropertyListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Properties.PropertyListResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Properties"
        ]
      },
      "post": {
        "operationId": "Properties_create",
        "summary": "Create a property",
        "description": "Create a property. The created property is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Properties.PropertyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "Properties"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Properties.PropertyCreateRequest"
              }
            }
          }
        }
      }
    },
    "/properties/options": {
      "get": {
        "operationId": "Properties_options",
        "summary": "List property options",
        "description": "List properties as lightweight options for selectors. Not paginated.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Properties.PropertyOption"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Properties"
        ]
      }
    },
    "/properties/{id}": {
      "get": {
        "operationId": "Properties_read",
        "summary": "Retrieve a property",
        "description": "Retrieve a property by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Properties.PropertyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Properties"
        ]
      },
      "put": {
        "operationId": "Properties_update",
        "summary": "Update a property",
        "description": "Update a property by its identifier. Attributes absent from the request are left unchanged. The updated property is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Properties.PropertyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Properties"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Properties.PropertyUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "Properties_delete",
        "summary": "Delete a property",
        "description": "Delete a property by its identifier. Deletion is permanent — a removed property cannot be restored.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "name": "force",
            "in": "query",
            "required": false,
            "description": "Delete the property even when it has connected channels. Without it, a property with at least one channel is refused.",
            "schema": {
              "type": "boolean"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Properties"
        ]
      }
    },
    "/property_facilities": {
      "get": {
        "operationId": "Facilities_listPropertyFacilities",
        "summary": "List property facilities",
        "description": "List property facilities — the amenities that can be attached to a property.\nSend the identifiers of the ones a property offers in its `facilities` field\non create or update; they come back under the property's `facilities`\nrelationship.\n\nResults are paginated, ten per page by default, ordered by title ascending;\nthe `meta` block carries the page, limit, total and ordering.\n\nThe categories of this dictionary are `activites`, `food_and_drink`,\n`general`, `outdoors`, `parking`, `pets`, `safety_and_security`, `services`\nand `sustainable_practice`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.filterCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.orderCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.orderInsertedAt"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Facilities.FacilityResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Facilities"
        ]
      }
    },
    "/property_facilities/options": {
      "get": {
        "operationId": "Facilities_propertyFacilityOptions",
        "summary": "List property facility options",
        "description": "List the whole property facility dictionary in one flat collection, without\npagination — useful for populating selectors. The resources and their\ncategories are those of the paginated list; `pagination[…]` is accepted and\nhas no effect.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.filterCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.orderCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Facilities.FacilityResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Facilities"
        ]
      }
    },
    "/property_users": {
      "get": {
        "operationId": "PropertyUsers_list",
        "summary": "List property users",
        "description": "List the users of one property. `filter[property_id]` is required. Not paginated.",
        "parameters": [
          {
            "$ref": "#/components/parameters/PropertyUsers.PropertyUserListParams"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/PropertyUsers.PropertyUserResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Property Users"
        ]
      },
      "post": {
        "operationId": "PropertyUsers_invite",
        "summary": "Invite a user to a property",
        "description": "Invite a user to a property. A user without a Channex account gets one, and an\nonboarding email. An address already invited to the property is refused. The\ncreated access is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PropertyUsers.PropertyUserResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Property Users"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PropertyUsers.PropertyUserCreateRequest"
              }
            }
          }
        }
      }
    },
    "/property_users/{id}": {
      "get": {
        "operationId": "PropertyUsers_read",
        "summary": "Retrieve a property user",
        "description": "Retrieve an access by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PropertyUsers.PropertyUserResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Property Users"
        ]
      },
      "put": {
        "operationId": "PropertyUsers_update",
        "summary": "Update a property user",
        "description": "Update an access: its role, its access policy overrides, or the property and user it\nlinks. Attributes absent from the request are left unchanged. The updated access is\nreturned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/PropertyUsers.PropertyUserResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Property Users"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PropertyUsers.PropertyUserUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "PropertyUsers_withdraw",
        "summary": "Withdraw a property user",
        "description": "Withdraw a user's access to the property. A user cannot withdraw their own access:\nthe request is refused with `400` and `details` naming the reason.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "400": {
            "description": "The request could not be processed in the current state; `details` explains why.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.BadRequestWithReason"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Property Users"
        ]
      }
    },
    "/rate_plans": {
      "get": {
        "operationId": "RatePlans_list",
        "summary": "List rate plans",
        "description": "List rate plans, including those a channel created for its own mapping. Results are paginated; the `meta` block carries the page, limit, total and ordering.",
        "parameters": [
          {
            "name": "filter[property_id]",
            "in": "query",
            "required": false,
            "description": "Return only the rate plans of this property.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[room_type_id]",
            "in": "query",
            "required": false,
            "description": "Return only the rate plans of this room type.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "name": "order[title]",
            "in": "query",
            "required": false,
            "description": "Order rate plans by title. Applied by default, ascending.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "$ref": "#/components/parameters/RatePlans.RatePlanListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RatePlans.RatePlanResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Rate Plans"
        ]
      },
      "post": {
        "operationId": "RatePlans_create",
        "summary": "Create a rate plan",
        "description": "Create a rate plan for a room type. The created rate plan is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RatePlans.RatePlanResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                },
                "examples": {
                  "Per Room Manual": {
                    "summary": "Per Room Manual",
                    "description": "A per-room rate plan with one option for the maximum occupancy.",
                    "value": {
                      "data": {
                        "type": "rate_plan",
                        "id": "4b7b3c1e-2a3f-4c8d-9e1a-5f6b7c8d9e0f",
                        "attributes": {
                          "currency": "GBP",
                          "meal_type": "none",
                          "tax_set_id": "4adfa81f-af0a-4b39-834f-1336ab065c08",
                          "cancellation_policy_id": "5b2c9d1e-3f4a-4b5c-8d6e-7f8a9b0c1d2e",
                          "ui_read_only": false,
                          "meta": {
                            "pms_code": "BAR"
                          },
                          "auto_rate_settings": null,
                          "inherit_rate": false,
                          "inherit_closed_to_arrival": false,
                          "inherit_closed_to_departure": false,
                          "inherit_stop_sell": false,
                          "inherit_min_stay_arrival": false,
                          "inherit_min_stay_through": false,
                          "inherit_max_stay": false,
                          "inherit_max_availability": false,
                          "inherit_availability_offset": false,
                          "children_fee": "0.00",
                          "infant_fee": "0.00",
                          "max_stay": [
                            0,
                            0,
                            0,
                            0,
                            0,
                            0,
                            0
                          ],
                          "min_stay_arrival": [
                            1,
                            1,
                            1,
                            1,
                            1,
                            1,
                            1
                          ],
                          "min_stay_through": [
                            1,
                            1,
                            1,
                            1,
                            1,
                            1,
                            1
                          ],
                          "closed_to_arrival": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "closed_to_departure": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "stop_sell": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "id": "4b7b3c1e-2a3f-4c8d-9e1a-5f6b7c8d9e0f",
                          "title": "Best Available Rate",
                          "sell_mode": "per_room",
                          "rate_mode": "manual",
                          "options": [
                            {
                              "inherit_rate": false,
                              "inherit_closed_to_arrival": false,
                              "inherit_closed_to_departure": false,
                              "inherit_stop_sell": false,
                              "inherit_min_stay_arrival": false,
                              "inherit_min_stay_through": false,
                              "inherit_max_stay": false,
                              "inherit_max_availability": false,
                              "inherit_availability_offset": false,
                              "rate_category_id": null,
                              "id": "4b7b3c1e-2a3f-4c8d-9e1a-5f6b7c8d9e0f",
                              "occupancy": 3,
                              "is_primary": true,
                              "rate": "100.00",
                              "derived_option": null
                            }
                          ]
                        },
                        "relationships": {
                          "room_type": {
                            "data": {
                              "id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                              "type": "room_type"
                            }
                          },
                          "property": {
                            "data": {
                              "id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                              "type": "property"
                            }
                          }
                        }
                      }
                    }
                  },
                  "Per Person Manual": {
                    "summary": "Per Person Manual",
                    "description": "A per-person rate plan with an option for each possible count of adult guests.",
                    "value": {
                      "data": {
                        "type": "rate_plan",
                        "id": "9d2e4f60-7a8b-4c1d-8e2f-3a4b5c6d7e8f",
                        "attributes": {
                          "currency": "GBP",
                          "meal_type": "none",
                          "tax_set_id": "4adfa81f-af0a-4b39-834f-1336ab065c08",
                          "cancellation_policy_id": "5b2c9d1e-3f4a-4b5c-8d6e-7f8a9b0c1d2e",
                          "ui_read_only": false,
                          "meta": {
                            "pms_code": "BAR"
                          },
                          "auto_rate_settings": null,
                          "inherit_rate": false,
                          "inherit_closed_to_arrival": false,
                          "inherit_closed_to_departure": false,
                          "inherit_stop_sell": false,
                          "inherit_min_stay_arrival": false,
                          "inherit_min_stay_through": false,
                          "inherit_max_stay": false,
                          "inherit_max_availability": false,
                          "inherit_availability_offset": false,
                          "children_fee": "0.00",
                          "infant_fee": "0.00",
                          "max_stay": [
                            0,
                            0,
                            0,
                            0,
                            0,
                            0,
                            0
                          ],
                          "min_stay_arrival": [
                            1,
                            1,
                            1,
                            1,
                            1,
                            1,
                            1
                          ],
                          "min_stay_through": [
                            1,
                            1,
                            1,
                            1,
                            1,
                            1,
                            1
                          ],
                          "closed_to_arrival": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "closed_to_departure": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "stop_sell": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "id": "9d2e4f60-7a8b-4c1d-8e2f-3a4b5c6d7e8f",
                          "title": "Per Person Rate",
                          "sell_mode": "per_person",
                          "rate_mode": "manual",
                          "options": [
                            {
                              "inherit_rate": false,
                              "inherit_closed_to_arrival": false,
                              "inherit_closed_to_departure": false,
                              "inherit_stop_sell": false,
                              "inherit_min_stay_arrival": false,
                              "inherit_min_stay_through": false,
                              "inherit_max_stay": false,
                              "inherit_max_availability": false,
                              "inherit_availability_offset": false,
                              "rate_category_id": null,
                              "id": "9d2e4f60-7a8b-4c1d-8e2f-3a4b5c6d7e8f",
                              "occupancy": 3,
                              "is_primary": true,
                              "rate": "100.00",
                              "derived_option": null
                            },
                            {
                              "inherit_rate": false,
                              "inherit_closed_to_arrival": false,
                              "inherit_closed_to_departure": false,
                              "inherit_stop_sell": false,
                              "inherit_min_stay_arrival": false,
                              "inherit_min_stay_through": false,
                              "inherit_max_stay": false,
                              "inherit_max_availability": false,
                              "inherit_availability_offset": false,
                              "rate_category_id": null,
                              "id": "c1d2e3f4-0a1b-4c2d-8e3f-4a5b6c7d8e90",
                              "occupancy": 1,
                              "is_primary": false,
                              "rate": "80.00",
                              "derived_option": null
                            },
                            {
                              "inherit_rate": false,
                              "inherit_closed_to_arrival": false,
                              "inherit_closed_to_departure": false,
                              "inherit_stop_sell": false,
                              "inherit_min_stay_arrival": false,
                              "inherit_min_stay_through": false,
                              "inherit_max_stay": false,
                              "inherit_max_availability": false,
                              "inherit_availability_offset": false,
                              "rate_category_id": null,
                              "id": "d2e3f405-1b2c-4d3e-9f40-5b6c7d8e9f01",
                              "occupancy": 2,
                              "is_primary": false,
                              "rate": "90.00",
                              "derived_option": null
                            }
                          ]
                        },
                        "relationships": {
                          "room_type": {
                            "data": {
                              "id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                              "type": "room_type"
                            }
                          },
                          "property": {
                            "data": {
                              "id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                              "type": "property"
                            }
                          }
                        }
                      }
                    }
                  },
                  "Per Person Derived": {
                    "summary": "Per Person Derived",
                    "description": "A per-person rate plan derived from a parent: the primary option follows the parent's price, the other occupancies add a percent to it.",
                    "value": {
                      "data": {
                        "type": "rate_plan",
                        "id": "e3f40516-2c3d-4e4f-a051-6c7d8e9f0a12",
                        "attributes": {
                          "currency": "GBP",
                          "meal_type": "none",
                          "tax_set_id": "4adfa81f-af0a-4b39-834f-1336ab065c08",
                          "cancellation_policy_id": "5b2c9d1e-3f4a-4b5c-8d6e-7f8a9b0c1d2e",
                          "ui_read_only": false,
                          "meta": {
                            "pms_code": "BAR"
                          },
                          "auto_rate_settings": null,
                          "inherit_rate": true,
                          "inherit_closed_to_arrival": false,
                          "inherit_closed_to_departure": false,
                          "inherit_stop_sell": true,
                          "inherit_min_stay_arrival": true,
                          "inherit_min_stay_through": true,
                          "inherit_max_stay": true,
                          "inherit_max_availability": false,
                          "inherit_availability_offset": false,
                          "children_fee": "15.00",
                          "infant_fee": "5.00",
                          "max_stay": [
                            0,
                            0,
                            0,
                            0,
                            0,
                            0,
                            0
                          ],
                          "min_stay_arrival": [
                            1,
                            1,
                            1,
                            1,
                            1,
                            1,
                            1
                          ],
                          "min_stay_through": [
                            1,
                            1,
                            1,
                            1,
                            1,
                            1,
                            1
                          ],
                          "closed_to_arrival": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "closed_to_departure": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "stop_sell": [
                            false,
                            false,
                            false,
                            false,
                            false,
                            false,
                            false
                          ],
                          "id": "e3f40516-2c3d-4e4f-a051-6c7d8e9f0a12",
                          "title": "Non-Refundable Rate",
                          "sell_mode": "per_person",
                          "rate_mode": "derived",
                          "options": [
                            {
                              "inherit_rate": false,
                              "inherit_closed_to_arrival": false,
                              "inherit_closed_to_departure": false,
                              "inherit_stop_sell": false,
                              "inherit_min_stay_arrival": false,
                              "inherit_min_stay_through": false,
                              "inherit_max_stay": false,
                              "inherit_max_availability": false,
                              "inherit_availability_offset": false,
                              "rate_category_id": null,
                              "id": "e3f40516-2c3d-4e4f-a051-6c7d8e9f0a12",
                              "occupancy": 1,
                              "is_primary": true,
                              "rate": "0.00",
                              "derived_option": {
                                "rate": []
                              }
                            },
                            {
                              "inherit_rate": false,
                              "inherit_closed_to_arrival": false,
                              "inherit_closed_to_departure": false,
                              "inherit_stop_sell": false,
                              "inherit_min_stay_arrival": false,
                              "inherit_min_stay_through": false,
                              "inherit_max_stay": false,
                              "inherit_max_availability": false,
                              "inherit_availability_offset": false,
                              "rate_category_id": null,
                              "id": "f4051627-3d4e-4f50-b162-7d8e9f0a1b23",
                              "occupancy": 2,
                              "is_primary": false,
                              "rate": "0.00",
                              "derived_option": {
                                "rate": [
                                  [
                                    "increase_by_percent",
                                    "10.00"
                                  ]
                                ]
                              }
                            },
                            {
                              "inherit_rate": false,
                              "inherit_closed_to_arrival": false,
                              "inherit_closed_to_departure": false,
                              "inherit_stop_sell": false,
                              "inherit_min_stay_arrival": false,
                              "inherit_min_stay_through": false,
                              "inherit_max_stay": false,
                              "inherit_max_availability": false,
                              "inherit_availability_offset": false,
                              "rate_category_id": null,
                              "id": "05162738-4e5f-4061-c273-8e9f0a1b2c34",
                              "occupancy": 3,
                              "is_primary": false,
                              "rate": "0.00",
                              "derived_option": {
                                "rate": [
                                  [
                                    "increase_by_percent",
                                    "20.00"
                                  ]
                                ]
                              }
                            }
                          ]
                        },
                        "relationships": {
                          "room_type": {
                            "data": {
                              "id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                              "type": "room_type"
                            }
                          },
                          "property": {
                            "data": {
                              "id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                              "type": "property"
                            }
                          },
                          "parent_rate_plan": {
                            "data": {
                              "id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                              "type": "rate_plan"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                },
                "examples": {
                  "Invalid Derived Option Value": {
                    "summary": "Invalid Derived Option Value",
                    "description": "An option's `derived_option` with `[\"decrease_by_percent\", \"100\"]` as the first `rate` rule and `[\"set\", 0]` for `min_stay_arrival`.",
                    "value": {
                      "errors": {
                        "code": "validation_error",
                        "title": "Validation Error",
                        "details": {
                          "options.derived_option.rate.0.1": [
                            "percent must be less than 100"
                          ],
                          "options.derived_option.min_stay_arrival.0.1": [
                            "must be a positive integer"
                          ]
                        }
                      }
                    }
                  },
                  "Invalid Derived Option Rule": {
                    "summary": "Invalid Derived Option Rule",
                    "description": "An option's `derived_option` with an unknown operation in the first `rate` rule and an unknown restriction key.",
                    "value": {
                      "errors": {
                        "code": "validation_error",
                        "title": "Validation Error",
                        "details": {
                          "options.derived_option.rate.0.0": [
                            "incorrect derived_option rule"
                          ],
                          "options.derived_option.ratee": [
                            "unknown restriction"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "tags": [
          "Rate Plans"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RatePlans.RatePlanCreateRequest"
              },
              "examples": {
                "Per Room Manual": {
                  "summary": "Per Room Manual",
                  "description": "A per-room rate plan with one option for the maximum occupancy.",
                  "value": {
                    "rate_plan": {
                      "parent_rate_plan_id": null,
                      "currency": "GBP",
                      "meal_type": "none",
                      "tax_set_id": "4adfa81f-af0a-4b39-834f-1336ab065c08",
                      "cancellation_policy_id": "5b2c9d1e-3f4a-4b5c-8d6e-7f8a9b0c1d2e",
                      "ui_read_only": false,
                      "meta": {
                        "pms_code": "BAR"
                      },
                      "auto_rate_settings": null,
                      "inherit_rate": false,
                      "inherit_closed_to_arrival": false,
                      "inherit_closed_to_departure": false,
                      "inherit_stop_sell": false,
                      "inherit_min_stay_arrival": false,
                      "inherit_min_stay_through": false,
                      "inherit_max_stay": false,
                      "inherit_max_availability": false,
                      "inherit_availability_offset": false,
                      "children_fee": "0.00",
                      "infant_fee": "0.00",
                      "max_stay": [
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                      ],
                      "min_stay_arrival": [
                        1,
                        1,
                        1,
                        1,
                        1,
                        1,
                        1
                      ],
                      "min_stay_through": [
                        1,
                        1,
                        1,
                        1,
                        1,
                        1,
                        1
                      ],
                      "closed_to_arrival": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "closed_to_departure": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "stop_sell": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "title": "Best Available Rate",
                      "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                      "room_type_id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                      "sell_mode": "per_room",
                      "rate_mode": "manual",
                      "options": [
                        {
                          "occupancy": 3,
                          "is_primary": true,
                          "rate": "100.00"
                        }
                      ]
                    }
                  }
                },
                "Per Person Manual": {
                  "summary": "Per Person Manual",
                  "description": "A per-person rate plan with an option for each possible count of adult guests.",
                  "value": {
                    "rate_plan": {
                      "parent_rate_plan_id": null,
                      "currency": "GBP",
                      "meal_type": "none",
                      "tax_set_id": "4adfa81f-af0a-4b39-834f-1336ab065c08",
                      "cancellation_policy_id": "5b2c9d1e-3f4a-4b5c-8d6e-7f8a9b0c1d2e",
                      "ui_read_only": false,
                      "meta": {
                        "pms_code": "BAR"
                      },
                      "auto_rate_settings": null,
                      "inherit_rate": false,
                      "inherit_closed_to_arrival": false,
                      "inherit_closed_to_departure": false,
                      "inherit_stop_sell": false,
                      "inherit_min_stay_arrival": false,
                      "inherit_min_stay_through": false,
                      "inherit_max_stay": false,
                      "inherit_max_availability": false,
                      "inherit_availability_offset": false,
                      "children_fee": "0.00",
                      "infant_fee": "0.00",
                      "max_stay": [
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                      ],
                      "min_stay_arrival": [
                        1,
                        1,
                        1,
                        1,
                        1,
                        1,
                        1
                      ],
                      "min_stay_through": [
                        1,
                        1,
                        1,
                        1,
                        1,
                        1,
                        1
                      ],
                      "closed_to_arrival": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "closed_to_departure": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "stop_sell": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "title": "Per Person Rate",
                      "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                      "room_type_id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                      "sell_mode": "per_person",
                      "rate_mode": "manual",
                      "options": [
                        {
                          "occupancy": 1,
                          "is_primary": false,
                          "rate": "80.00"
                        },
                        {
                          "occupancy": 2,
                          "is_primary": false,
                          "rate": "90.00"
                        },
                        {
                          "occupancy": 3,
                          "is_primary": true,
                          "rate": "100.00"
                        }
                      ]
                    }
                  }
                },
                "Per Person Derived": {
                  "summary": "Per Person Derived",
                  "description": "A per-person rate plan derived from a parent: the primary option follows the parent's price, the other occupancies add a percent to it.",
                  "value": {
                    "rate_plan": {
                      "parent_rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                      "currency": "GBP",
                      "meal_type": "none",
                      "tax_set_id": "4adfa81f-af0a-4b39-834f-1336ab065c08",
                      "cancellation_policy_id": "5b2c9d1e-3f4a-4b5c-8d6e-7f8a9b0c1d2e",
                      "ui_read_only": false,
                      "meta": {
                        "pms_code": "BAR"
                      },
                      "auto_rate_settings": null,
                      "inherit_rate": true,
                      "inherit_closed_to_arrival": false,
                      "inherit_closed_to_departure": false,
                      "inherit_stop_sell": true,
                      "inherit_min_stay_arrival": true,
                      "inherit_min_stay_through": true,
                      "inherit_max_stay": true,
                      "inherit_max_availability": false,
                      "inherit_availability_offset": false,
                      "children_fee": "15.00",
                      "infant_fee": 500,
                      "max_stay": [
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                      ],
                      "min_stay_arrival": [
                        1,
                        1,
                        1,
                        1,
                        1,
                        1,
                        1
                      ],
                      "min_stay_through": [
                        1,
                        1,
                        1,
                        1,
                        1,
                        1,
                        1
                      ],
                      "closed_to_arrival": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "closed_to_departure": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "stop_sell": [
                        false,
                        false,
                        false,
                        false,
                        false,
                        false,
                        false
                      ],
                      "title": "Non-Refundable Rate",
                      "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                      "room_type_id": "994d1375-dbbd-4072-8724-b2ab32ce781b",
                      "sell_mode": "per_person",
                      "rate_mode": "derived",
                      "options": [
                        {
                          "occupancy": 1,
                          "is_primary": true,
                          "rate": "0.00"
                        },
                        {
                          "occupancy": 2,
                          "is_primary": false,
                          "rate": "0.00",
                          "derived_option": {
                            "rate": [
                              [
                                "increase_by_percent",
                                "10.00"
                              ]
                            ]
                          }
                        },
                        {
                          "occupancy": 3,
                          "is_primary": false,
                          "rate": "0.00",
                          "derived_option": {
                            "rate": [
                              [
                                "increase_by_percent",
                                "20.00"
                              ]
                            ]
                          }
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/rate_plans/options": {
      "get": {
        "operationId": "RatePlans_options",
        "summary": "List rate plan options",
        "description": "List rate plans as lightweight options for selectors. Not paginated. Rate plans a channel created for its own mapping are not listed.",
        "parameters": [
          {
            "name": "filter[property_id]",
            "in": "query",
            "required": false,
            "description": "Return only the rate plans of this property.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "filter[room_type_id]",
            "in": "query",
            "required": false,
            "description": "Return only the rate plans of this room type.",
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "explode": false
          },
          {
            "name": "order[title]",
            "in": "query",
            "required": false,
            "description": "Order rate plans by title. Applied by default, ascending.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RatePlans.RatePlanOptionResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Rate Plans"
        ]
      }
    },
    "/rate_plans/{id}": {
      "get": {
        "operationId": "RatePlans_read",
        "summary": "Retrieve a rate plan",
        "description": "Retrieve a rate plan by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RatePlans.RatePlanResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Rate Plans"
        ]
      },
      "put": {
        "operationId": "RatePlans_update",
        "summary": "Update a rate plan",
        "description": "Update a rate plan by its identifier. Attributes absent from the request are left unchanged. The updated rate plan is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RatePlans.RatePlanResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                },
                "examples": {
                  "Invalid Derived Option Value": {
                    "summary": "Invalid Derived Option Value",
                    "description": "An option's `derived_option` with `[\"decrease_by_percent\", \"100\"]` as the first `rate` rule and `[\"set\", 0]` for `min_stay_arrival`.",
                    "value": {
                      "errors": {
                        "code": "validation_error",
                        "title": "Validation Error",
                        "details": {
                          "options.derived_option.rate.0.1": [
                            "percent must be less than 100"
                          ],
                          "options.derived_option.min_stay_arrival.0.1": [
                            "must be a positive integer"
                          ]
                        }
                      }
                    }
                  },
                  "Invalid Derived Option Rule": {
                    "summary": "Invalid Derived Option Rule",
                    "description": "An option's `derived_option` with an unknown operation in the first `rate` rule and an unknown restriction key.",
                    "value": {
                      "errors": {
                        "code": "validation_error",
                        "title": "Validation Error",
                        "details": {
                          "options.derived_option.rate.0.0": [
                            "incorrect derived_option rule"
                          ],
                          "options.derived_option.ratee": [
                            "unknown restriction"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "tags": [
          "Rate Plans"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RatePlans.RatePlanUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "RatePlans_delete",
        "summary": "Delete a rate plan",
        "description": "Delete a rate plan by its identifier. A rate plan mapped to a channel is refused with `422 Unprocessable Entity` unless `force=true` is sent. Rate plans derived from it (those with it as `parent_rate_plan_id`) are deleted with it.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "name": "force",
            "in": "query",
            "required": false,
            "description": "Delete the rate plan even when it is mapped to a channel: the mappings are removed with it and the channel notified. Without it the request fails when channel mappings would be affected. Irreversible: neither the rate plan nor its channel information can be restored.",
            "schema": {
              "type": "boolean"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Rate Plans"
        ]
      }
    },
    "/restrictions": {
      "get": {
        "operationId": "Ari_listRestrictions",
        "summary": "Read rates and restrictions",
        "description": "Read rate and restriction values per Rate Plan and date. The answer maps each\nRate Plan of the Property to its dates, and each date to the values that were\nasked for.\n\n`filter[restrictions]` names those values; a name outside the set is ignored,\nand a request whose every name is ignored answers each date as an empty\nobject. The dates come from either a single `filter[date]` or the range\n`filter[date][gte]`–`filter[date][lte]`. Both the Property and the dates are\nrequired.\n\nA Rate Plan with no state for the dates asked for maps to an empty object,\nand a Property the credentials cannot reach yields an empty `data` object\nrather than `403 Forbidden` or `404 Not Found`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Restrictions.RestrictionListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Restrictions.RestrictionListParams.date"
          },
          {
            "$ref": "#/components/parameters/Restrictions.RestrictionListParams.dateGte"
          },
          {
            "$ref": "#/components/parameters/Restrictions.RestrictionListParams.dateLte"
          },
          {
            "$ref": "#/components/parameters/Restrictions.RestrictionListParams.restrictions"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Restrictions.RestrictionsDocument"
                },
                "examples": {
                  "Three dates of one rate plan": {
                    "summary": "Three dates of one rate plan",
                    "description": "Four values over a three-day range, one of them a date closed for sale.",
                    "value": {
                      "data": {
                        "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2": {
                          "2026-10-01": {
                            "rate": "200.00",
                            "availability": 5,
                            "min_stay_arrival": 1,
                            "stop_sell": false
                          },
                          "2026-10-02": {
                            "rate": "200.00",
                            "availability": 5,
                            "min_stay_arrival": 2,
                            "stop_sell": false
                          },
                          "2026-10-03": {
                            "rate": "250.00",
                            "availability": 0,
                            "min_stay_arrival": 2,
                            "stop_sell": true
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request has missing or invalid arguments; `details` lists the reasons.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.BadRequestWithReasons"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "ARI"
        ]
      },
      "post": {
        "operationId": "Ari_updateRestrictions",
        "summary": "Update rates and restrictions",
        "description": "Update rates and restrictions for specific Rate Plans and dates. Each change\nobject carries the Property and the Rate Plan it applies to, and targets\neither a single `date` or the range `date_from`–`date_to`, optionally\nnarrowed to specific `days`. Sending both a `date` and the pair is refused,\nand so is sending neither.\n\nChanges are applied asynchronously: `data` carries one background task\nreference per Property, and the new values are readable a moment later rather\nthan at once. See the Tasks resource to follow a task to completion.\n\nChange objects are applied in the order given, so a broad range can be set\nfirst and overridden by later, narrower objects.\n\nA change object that fails validation is rejected on its own and reported\nunder `meta.warnings` while the others are still applied — such a response is\nstill `200 OK`, and `data` is empty only when every change object was\nrejected. A range that starts in the past is clamped to today rather than\nrejected, and the clamp is reported as a warning of its own.\n\nRate limited to ten requests a minute per Property. Availability updates\ncarry a limit of ten a minute of their own, so twenty ARI updates a minute\nper Property in all; beyond that the request answers `429 Too Many\nRequests`, and nothing is applied until the limit expires.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Restrictions.UpdateAcknowledgement"
                },
                "examples": {
                  "Full sync": {
                    "summary": "Full sync",
                    "description": "What a client pushes on connect: a rate and every writable restriction for one Rate Plan over a season, in a single change object.",
                    "value": {
                      "data": [
                        {
                          "id": "eb31d631-4fcc-478a-80c3-bf7a2acf0699",
                          "type": "task"
                        }
                      ],
                      "meta": {
                        "message": "Success"
                      }
                    }
                  },
                  "One rate over a date range": {
                    "summary": "One rate over a date range",
                    "description": "The everyday change: one rate for every date of a range, sent in the minimum fraction of the currency.",
                    "value": {
                      "data": [
                        {
                          "id": "eb31d631-4fcc-478a-80c3-bf7a2acf0699",
                          "type": "task"
                        }
                      ],
                      "meta": {
                        "message": "Success"
                      }
                    }
                  },
                  "Rate as a decimal string": {
                    "summary": "Rate as a decimal string",
                    "description": "The same change with the rate written as a decimal string rather than in minor units. Either form reads back as a decimal string.",
                    "value": {
                      "data": [
                        {
                          "id": "eb31d631-4fcc-478a-80c3-bf7a2acf0699",
                          "type": "task"
                        }
                      ],
                      "meta": {
                        "message": "Success"
                      }
                    }
                  },
                  "A single date, a range, and a range narrowed by days": {
                    "summary": "A single date, a range, and a range narrowed by days",
                    "description": "The three ways a change object is targeted, in one request. Later objects override earlier ones on the dates they share, so the weekend rate wins over the range rate.",
                    "value": {
                      "data": [
                        {
                          "id": "eb31d631-4fcc-478a-80c3-bf7a2acf0699",
                          "type": "task"
                        }
                      ],
                      "meta": {
                        "message": "Success"
                      }
                    }
                  },
                  "Per-occupancy rates": {
                    "summary": "Per-occupancy rates",
                    "description": "A Rate Plan sold per person takes `rates`, one entry per occupancy, instead of the single `rate`.",
                    "value": {
                      "data": [
                        {
                          "id": "eb31d631-4fcc-478a-80c3-bf7a2acf0699",
                          "type": "task"
                        }
                      ],
                      "meta": {
                        "message": "Success"
                      }
                    }
                  },
                  "One restriction, no rate": {
                    "summary": "One restriction, no rate",
                    "description": "Only the Property, the Rate Plan and the dates are required, so a change object can carry a restriction and no rate at all.",
                    "value": {
                      "data": [
                        {
                          "id": "eb31d631-4fcc-478a-80c3-bf7a2acf0699",
                          "type": "task"
                        }
                      ],
                      "meta": {
                        "message": "Success"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          },
          "429": {
            "description": "The client has sent too many requests and is being rate limited.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.TooManyRequests"
                }
              }
            }
          }
        },
        "tags": [
          "ARI"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Restrictions.RestrictionsUpdateRequest"
              },
              "examples": {
                "Full sync": {
                  "summary": "Full sync",
                  "description": "What a client pushes on connect: a rate and every writable restriction for one Rate Plan over a season, in a single change object.",
                  "value": {
                    "values": [
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date_from": "2026-10-01",
                        "date_to": "2026-12-31",
                        "rate": 20000,
                        "min_stay_arrival": 2,
                        "min_stay_through": 1,
                        "max_stay": 14,
                        "max_sell": 8,
                        "closed_to_arrival": false,
                        "closed_to_departure": false,
                        "stop_sell": false
                      }
                    ]
                  }
                },
                "One rate over a date range": {
                  "summary": "One rate over a date range",
                  "description": "The everyday change: one rate for every date of a range, sent in the minimum fraction of the currency.",
                  "value": {
                    "values": [
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date_from": "2026-10-01",
                        "date_to": "2026-10-31",
                        "rate": 20000
                      }
                    ]
                  }
                },
                "Rate as a decimal string": {
                  "summary": "Rate as a decimal string",
                  "description": "The same change with the rate written as a decimal string rather than in minor units. Either form reads back as a decimal string.",
                  "value": {
                    "values": [
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date_from": "2026-10-01",
                        "date_to": "2026-10-31",
                        "rate": "150.50"
                      }
                    ]
                  }
                },
                "A single date, a range, and a range narrowed by days": {
                  "summary": "A single date, a range, and a range narrowed by days",
                  "description": "The three ways a change object is targeted, in one request. Later objects override earlier ones on the dates they share, so the weekend rate wins over the range rate.",
                  "value": {
                    "values": [
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date": "2026-10-01",
                        "rate": 18000
                      },
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date_from": "2026-10-02",
                        "date_to": "2026-10-31",
                        "rate": 20000
                      },
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date_from": "2026-10-02",
                        "date_to": "2026-10-31",
                        "days": [
                          "sa",
                          "su"
                        ],
                        "rate": 25000
                      }
                    ]
                  }
                },
                "Per-occupancy rates": {
                  "summary": "Per-occupancy rates",
                  "description": "A Rate Plan sold per person takes `rates`, one entry per occupancy, instead of the single `rate`.",
                  "value": {
                    "values": [
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date_from": "2026-10-01",
                        "date_to": "2026-10-31",
                        "rates": [
                          {
                            "occupancy": 1,
                            "rate": 12100
                          },
                          {
                            "occupancy": 2,
                            "rate": 13200
                          }
                        ]
                      }
                    ]
                  }
                },
                "One restriction, no rate": {
                  "summary": "One restriction, no rate",
                  "description": "Only the Property, the Rate Plan and the dates are required, so a change object can carry a restriction and no rate at all.",
                  "value": {
                    "values": [
                      {
                        "property_id": "716305c4-561a-4561-a187-7f5b8aeb5920",
                        "rate_plan_id": "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2",
                        "date_from": "2026-12-24",
                        "date_to": "2026-12-26",
                        "stop_sell": true
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/room_facilities": {
      "get": {
        "operationId": "RoomFacilities_listRoomFacilities",
        "summary": "List room type facilities",
        "description": "List room type facilities — the amenities that can be attached to a room\ntype. Send the identifiers of the ones a room type offers in its\n`facilities` field on create or update; they come back under the room\ntype's `facilities` relationship.\n\nResults are paginated, ten per page by default, ordered by title\nascending; the `meta` block carries the page, limit, total and ordering.\n\nThe categories of this dictionary are `bathroom`, `general`, `in_room`,\n`kitchen`, `outside`, `security` and `view`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.filterCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.orderCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityListParams.orderInsertedAt"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Facilities.FacilityResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Facilities"
        ]
      }
    },
    "/room_facilities/options": {
      "get": {
        "operationId": "RoomFacilities_roomFacilityOptions",
        "summary": "List room type facility options",
        "description": "List the whole room type facility dictionary in one flat collection, without\npagination — useful for populating selectors. The resources and their\ncategories are those of the paginated list; `pagination[…]` is accepted and\nhas no effect.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.filterCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.orderCategory"
          },
          {
            "$ref": "#/components/parameters/Facilities.FacilityOptionsParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Facilities.FacilityResource"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Facilities"
        ]
      }
    },
    "/room_types": {
      "get": {
        "operationId": "RoomTypes_list",
        "summary": "List room types",
        "description": "List room types. Results are paginated and ordered by title, ascending, by default; the `meta` block carries the page, limit, total and ordering.",
        "parameters": [
          {
            "$ref": "#/components/parameters/RoomTypes.RoomTypeListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "name": "order[title]",
            "in": "query",
            "required": false,
            "description": "Order room types by title.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[position]",
            "in": "query",
            "required": false,
            "description": "Order room types by their display position.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[inserted_at]",
            "in": "query",
            "required": false,
            "description": "Order room types by creation time.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RoomTypes.RoomTypeResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Room Types"
        ]
      },
      "post": {
        "operationId": "RoomTypes_create",
        "summary": "Create a room type",
        "description": "Create a room type for a property. The created room type is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RoomTypes.RoomTypeResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request was understood but could not be carried out; `details`, where present, names the reason per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.UnprocessableEntity"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Room Types"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoomTypes.RoomTypeCreateRequest"
              }
            }
          }
        }
      }
    },
    "/room_types/options": {
      "get": {
        "operationId": "RoomTypes_options",
        "summary": "List room type options",
        "description": "List room types as lightweight options (id, title, occupancy, display position, photo, property) for selectors. Not paginated; accepts the same property filter and ordering keys as the list.",
        "parameters": [
          {
            "$ref": "#/components/parameters/RoomTypes.RoomTypeOptionsParams.propertyId"
          },
          {
            "name": "order[title]",
            "in": "query",
            "required": false,
            "description": "Order room types by title.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[position]",
            "in": "query",
            "required": false,
            "description": "Order room types by their display position.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          },
          {
            "name": "order[inserted_at]",
            "in": "query",
            "required": false,
            "description": "Order room types by creation time.",
            "schema": {
              "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RoomTypes.RoomTypeOption"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Room Types"
        ]
      }
    },
    "/room_types/{id}": {
      "get": {
        "operationId": "RoomTypes_read",
        "summary": "Retrieve a room type",
        "description": "Retrieve a room type by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RoomTypes.RoomTypeResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Room Types"
        ]
      },
      "put": {
        "operationId": "RoomTypes_update",
        "summary": "Update a room type",
        "description": "Update a room type by its identifier. Attributes absent from the request are left unchanged. The updated room type is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "name": "force",
            "in": "query",
            "required": false,
            "description": "Remove occupancy options even when they are mapped to channels. Without it the request fails when channel mappings would be affected.",
            "schema": {
              "type": "boolean"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/RoomTypes.RoomTypeResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Room Types"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoomTypes.RoomTypeUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "RoomTypes_delete",
        "summary": "Delete a room type",
        "description": "Delete a room type by its identifier. A room type linked to a channel is refused with `422 Unprocessable Entity` unless `force=true` is sent.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          },
          {
            "name": "force",
            "in": "query",
            "required": false,
            "description": "Un-map the room type from its channels before removing it. Without it the request fails when channel mappings would be affected.",
            "schema": {
              "type": "boolean"
            },
            "explode": false
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Room Types"
        ]
      }
    },
    "/signing_keys": {
      "get": {
        "operationId": "SigningKeys_list",
        "summary": "List signing keys",
        "description": "List signing keys, their version secrets masked. Results are\npaginated and ordered by creation time, newest first.",
        "parameters": [
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyListParams.billingAccountId"
          },
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyListParams.filterId"
          },
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyListParams.title"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyListParams.orderInsertedAt"
          },
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyListParams.orderTitle"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SigningKeys.SigningKeyResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ]
      },
      "post": {
        "operationId": "SigningKeys_create",
        "summary": "Create a signing key",
        "description": "Create a signing key owned by the billing account named in `billing_account_id`. The\nkey is created together with its first, current secret version, and the response is\nthe only unmasked rendering of that version's `secret`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SigningKeys.SigningKeyWithSecretResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SigningKeys.SigningKeyCreateRequest"
              }
            }
          }
        }
      }
    },
    "/signing_keys/options": {
      "get": {
        "operationId": "SigningKeys_options",
        "summary": "List signing key options",
        "description": "List signing keys as lightweight options (id, title, masked active key) for\nselectors. Not paginated, ordered by title; `filter[billing_account_id]` is required\nunless the caller is an administrator, the same as for the list.",
        "parameters": [
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyOptionsParams.billingAccountId"
          },
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyOptionsParams.filterId"
          },
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyOptionsParams.title"
          },
          {
            "$ref": "#/components/parameters/SigningKeys.SigningKeyOptionsParams.orderTitle"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SigningKeys.SigningKeyOption"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ]
      }
    },
    "/signing_keys/{id}": {
      "get": {
        "operationId": "SigningKeys_read",
        "summary": "Retrieve a signing key",
        "description": "Retrieve a signing key by its identifier, its version secrets masked.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SigningKeys.SigningKeyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ]
      },
      "put": {
        "operationId": "SigningKeys_update",
        "summary": "Update a signing key",
        "description": "Update a signing key's title. The title is required — an empty body is refused — and\nthe owning billing account cannot be changed.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SigningKeys.SigningKeyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SigningKeys.SigningKeyUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "SigningKeys_delete",
        "summary": "Delete a signing key",
        "description": "Delete a signing key. A key a webhook still signs with cannot be deleted: the request\nanswers `422` naming the key. Re-point or delete those webhooks first.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ]
      }
    },
    "/signing_keys/{id}/generate": {
      "post": {
        "operationId": "SigningKeys_generate",
        "summary": "Generate a secret version",
        "description": "Generate a new secret version for the key.\n\nThe new version is created pending, not current, so consumers keep verifying against\nthe current secret — deliveries are signed with both until the key is rotated.\nGenerating again before rotating replaces the unused pending version with a fresh\none. On a key with no versions the new version is created as the current one.\n\nThe response is the only unmasked rendering of the new version's `secret`.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SigningKeys.SigningKeyWithSecretResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ]
      }
    },
    "/signing_keys/{id}/rotate": {
      "post": {
        "operationId": "SigningKeys_rotate",
        "summary": "Rotate a signing key",
        "description": "Rotate the key: promote the pending secret version to be the sole current version and\nretire the others. Afterwards deliveries are signed with the promoted secret only, so\nswitch verification to it — announced by its masked label in the `x-hmac-keys-256`\nheader — before rotating. No new secret is created and none is revealed: the response\nmasks the version secrets. A successful rotation stamps the\nkey's `rotated_at`. A key with no pending version cannot be rotated — generate one\nfirst.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SigningKeys.SigningKeyResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhook Signing Keys"
        ]
      }
    },
    "/tasks": {
      "get": {
        "operationId": "Tasks_list",
        "description": "List processed tasks, oldest first. Scope to a single property with `?filter[property_id]=<id>`.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Tasks.TaskListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/Tasks.TaskListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Tasks.TaskResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Tasks"
        ]
      }
    },
    "/tasks/{id}": {
      "get": {
        "operationId": "Tasks_read",
        "description": "Retrieve a single task by id, including its input payload, per-step timings, and channel events.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Tasks.TaskDetailResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Tasks"
        ]
      }
    },
    "/tax_sets": {
      "get": {
        "operationId": "TaxSets_list",
        "summary": "List tax sets",
        "description": "List tax sets. Results are paginated; the `meta` block carries the page, limit, total and ordering.",
        "parameters": [
          {
            "$ref": "#/components/parameters/TaxSets.TaxSetListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/TaxSets.TaxSetListParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/TaxSets.TaxSetListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TaxSets.TaxSetResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Tax Sets"
        ]
      },
      "post": {
        "operationId": "TaxSets_create",
        "summary": "Create a tax set",
        "description": "Create a tax set for a property. The created tax set is returned with `201 Created`; the first set of a property becomes its default.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TaxSets.TaxSetResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "Tax Sets"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaxSets.TaxSetCreateRequest"
              }
            }
          }
        }
      }
    },
    "/tax_sets/options": {
      "get": {
        "operationId": "TaxSets_options",
        "summary": "List tax set options",
        "description": "List tax sets as lightweight items (`id`, `title`, `currency`) for selectors. Not paginated; accepts the same property filter as the list.",
        "parameters": [
          {
            "$ref": "#/components/parameters/TaxSets.TaxSetOptionsParams"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TaxSets.TaxSetOption"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Tax Sets"
        ]
      }
    },
    "/tax_sets/test": {
      "post": {
        "operationId": "TaxSetCalculationPreview_test",
        "summary": "Preview a tax calculation",
        "description": "Preview a tax calculation without persisting anything: given taxes (by id) and a stay priced per night, returns the calculated amount per tax plus the total and net prices. A tax id that does not exist answers `404`.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TaxSets.TaxSetTestResultsResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                },
                "examples": {
                  "Two levels": {
                    "summary": "Two levels",
                    "description": "A per-night Cleaning Fee at level 1 and a 20% VAT added on top at level 0, on one night at 100.00: the fee is calculated first, the VAT on 100.00 + 10.00.",
                    "value": {
                      "data": {
                        "type": "tax_set_test_results",
                        "attributes": {
                          "taxes": {
                            "Cleaning Fee": "10.00",
                            "VAT 20%": "22.00"
                          },
                          "total_price": "132.00",
                          "net_price": "100.00"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Tax Sets"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaxSets.TaxSetTestRequest"
              },
              "examples": {
                "Two levels": {
                  "summary": "Two levels",
                  "description": "A per-night Cleaning Fee at level 1 and a 20% VAT added on top at level 0, on one night at 100.00: the fee is calculated first, the VAT on 100.00 + 10.00.",
                  "value": {
                    "test": {
                      "taxes": [
                        {
                          "id": "c1fb94b3-ce95-4233-be0e-2748b3728715",
                          "level": 1
                        },
                        {
                          "id": "a3c4f3c8-841c-4492-b5ff-ce9ca92c1c83",
                          "level": 0
                        }
                      ],
                      "currency": "GBP",
                      "date": "2026-07-01",
                      "days": [
                        "100.00"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tax_sets/{id}": {
      "get": {
        "operationId": "TaxSets_read",
        "summary": "Retrieve a tax set",
        "description": "Retrieve a tax set by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TaxSets.TaxSetResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Tax Sets"
        ]
      },
      "put": {
        "operationId": "TaxSets_update",
        "summary": "Update a tax set",
        "description": "Update a tax set by its identifier. `taxes` must be sent on every update; other attributes absent from the request are left unchanged. The updated tax set is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/TaxSets.TaxSetResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Tax Sets"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaxSets.TaxSetUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "TaxSets_delete",
        "summary": "Delete a tax set",
        "description": "Delete a tax set by its identifier. A set a property uses as its default cannot be deleted.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Tax Sets"
        ]
      }
    },
    "/taxes": {
      "get": {
        "operationId": "Taxes_list",
        "summary": "List taxes",
        "description": "List taxes. Results are paginated; the `meta` block carries the page, limit, total and ordering.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Taxes.TaxListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/Taxes.TaxListParams.orderTitle"
          },
          {
            "$ref": "#/components/parameters/Taxes.TaxListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Taxes.TaxResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Taxes"
        ]
      },
      "post": {
        "operationId": "Taxes_create",
        "summary": "Create a tax",
        "description": "Create a tax for a property. The created tax is returned with `201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Taxes.TaxResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request body failed validation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.ValidationError"
                }
              }
            }
          }
        },
        "tags": [
          "Taxes"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Taxes.TaxCreateRequest"
              }
            }
          }
        }
      }
    },
    "/taxes/options": {
      "get": {
        "operationId": "Taxes_options",
        "summary": "List tax options",
        "description": "List taxes as lightweight `id` + `title` items for selectors. Not paginated; accepts the same property filter as the list.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Taxes.TaxOptionsParams"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "type",
                          "id",
                          "attributes"
                        ],
                        "properties": {
                          "type": {
                            "type": "string",
                            "enum": [
                              "tax"
                            ]
                          },
                          "id": {
                            "$ref": "#/components/schemas/Common.Scalars.id"
                          },
                          "attributes": {
                            "$ref": "#/components/schemas/Common.JsonApi.OptionAttributes"
                          }
                        },
                        "description": "A lightweight JSON:API resource returned by `/options` endpoints — id + title only, no relationships or pagination."
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Taxes"
        ]
      }
    },
    "/taxes/{id}": {
      "get": {
        "operationId": "Taxes_read",
        "summary": "Retrieve a tax",
        "description": "Retrieve a tax by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Taxes.TaxResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Taxes"
        ]
      },
      "put": {
        "operationId": "Taxes_update",
        "summary": "Update a tax",
        "description": "Update a tax by its identifier. Attributes absent from the request are left unchanged. The updated tax is returned.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Taxes.TaxResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Taxes"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Taxes.TaxUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "Taxes_delete",
        "summary": "Delete a tax",
        "description": "Delete a tax by its identifier. A tax held by a tax set cannot be deleted while the set refers to it.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Taxes"
        ]
      }
    },
    "/timezones": {
      "get": {
        "operationId": "ReferenceData_timezones",
        "summary": "List time zones",
        "description": "List all IANA time zones with their current UTC offsets. The whole list is returned; the endpoint is not paginated.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ReferenceData.Timezone"
                      }
                    }
                  },
                  "description": "A plain data-array envelope without pagination — used by reference/dictionary endpoints."
                }
              }
            }
          }
        },
        "tags": [
          "Reference Data"
        ],
        "security": [
          {}
        ]
      }
    },
    "/webhooks": {
      "get": {
        "operationId": "Webhooks_list",
        "summary": "List webhooks",
        "description": "List webhooks. Results are paginated and ordered by creation time, newest first.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Webhooks.WebhookListParams.propertyId"
          },
          {
            "$ref": "#/components/parameters/Webhooks.WebhookListParams.isActive"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.page"
          },
          {
            "$ref": "#/components/parameters/Common.Pagination.PaginationParams.limit"
          },
          {
            "$ref": "#/components/parameters/Webhooks.WebhookListParams.orderInsertedAt"
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Webhooks.WebhookResource"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/Common.Pagination.PaginationMeta"
                    }
                  },
                  "description": "JSON:API document wrapping a collection of resources with pagination meta."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ]
      },
      "post": {
        "operationId": "Webhooks_create",
        "summary": "Create a webhook",
        "description": "Create a webhook. `property_id` is required unless `is_global` is true, and one\naccount may hold only one webhook per `callback_url` and `event_mask` pair. A\nwebhook is inactive until `is_active` is set, and the created webhook is returned with\n`201 Created`.",
        "parameters": [],
        "responses": {
          "201": {
            "description": "201 Created response wrapping a resource body.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Webhooks.WebhookResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Webhooks.WebhookCreateRequest"
              }
            }
          }
        }
      }
    },
    "/webhooks/events": {
      "get": {
        "operationId": "WebhookEventCatalog_events",
        "summary": "List webhook events",
        "description": "List every event type a webhook can subscribe to. Not paginated.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Webhooks.WebhookEvents"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ]
      }
    },
    "/webhooks/test": {
      "post": {
        "operationId": "WebhookTest_test",
        "summary": "Test a callback URL",
        "description": "Send a test POST to the callback URL and return what the target answered — its status\ncode and body, whatever they are, plus the attempt as a `delivery` log entry. A\ntarget that answers `405` or `404` is reported, not treated as an error. Neither the\nwebhook nor the delivery entry is stored.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Webhooks.WebhookTestResult"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidNestedArguments"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Webhooks.WebhookUpdateRequest"
              }
            }
          }
        }
      }
    },
    "/webhooks/{id}": {
      "get": {
        "operationId": "Webhooks_read",
        "summary": "Retrieve a webhook",
        "description": "Retrieve a webhook by its identifier.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Webhooks.WebhookResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ]
      },
      "put": {
        "operationId": "Webhooks_update",
        "summary": "Update a webhook",
        "description": "Update a webhook by its identifier. Attributes absent from the request are left\nunchanged. `is_global` cannot be changed after creation, and a protected webhook\ncannot be updated: the request answers `422` naming the flag.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Webhooks.WebhookResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Webhooks.WebhookUpdateRequest"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "Webhooks_delete",
        "summary": "Delete a webhook",
        "description": "Delete a webhook by its identifier. Its delivery log goes with it. A protected\nwebhook cannot be deleted: the request answers `422` naming the flag.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.JsonApi.SuccessMessage"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ]
      }
    },
    "/webhooks/{id}/test": {
      "post": {
        "operationId": "WebhookTest_testWebhook",
        "summary": "Test a webhook",
        "description": "Send a test POST through a stored webhook and return what the target answered.\nThe request body is optional: attributes carried in it override the stored\nconfiguration for this test only and are validated like on the callback-URL test.\nThe attempt is stored in the webhook's delivery log with `is_test: true`; test\nentries are not counted in delivery statistics.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Webhooks.WebhookTestResult"
                }
              }
            }
          },
          "400": {
            "description": "The request body could not be parsed as JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.UnparsableRequest"
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          },
          "403": {
            "description": "The authenticated user lacks permission to perform this action.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Forbidden"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.NotFound"
                }
              }
            }
          },
          "422": {
            "description": "The request has missing or invalid arguments; `details` lists the messages per argument.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Common.Errors.InvalidArguments"
                    },
                    {
                      "$ref": "#/components/schemas/Common.Errors.ValidationError"
                    }
                  ]
                }
              }
            }
          }
        },
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Webhooks.WebhookUpdateRequest"
              }
            }
          }
        }
      }
    },
    "/whoami": {
      "get": {
        "operationId": "AuthenticationCurrentUser_whoami",
        "description": "Return the currently authenticated user.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The request has succeeded.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Authentication.CurrentUserResource"
                    }
                  },
                  "description": "JSON:API document wrapping a single resource."
                }
              }
            }
          },
          "401": {
            "description": "Authentication credentials are missing or invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Common.Errors.Unauthorized"
                }
              }
            }
          }
        },
        "tags": [
          "Authentication"
        ]
      }
    }
  },
  "security": [
    {
      "UserApiKeyAuth": []
    }
  ],
  "components": {
    "parameters": {
      "BookingMessages.BookingMessageListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order messages by receive time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "BookingPayments.PaymentListParams.filterInsertedAtGte": {
        "name": "filter[inserted_at][gte]",
        "in": "query",
        "required": false,
        "description": "Return only payments inserted at or after the given time.",
        "schema": {
          "type": "string",
          "format": "date-time"
        },
        "explode": false
      },
      "BookingPayments.PaymentListParams.filterInsertedAtLte": {
        "name": "filter[inserted_at][lte]",
        "in": "query",
        "required": false,
        "description": "Return only payments inserted at or before the given time.",
        "schema": {
          "type": "string",
          "format": "date-time"
        },
        "explode": false
      },
      "BookingPayments.PaymentListParams.filterPaymentProviderId": {
        "name": "filter[payment_provider_id]",
        "in": "query",
        "required": false,
        "description": "Return only payments processed by the given payment provider.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "BookingPayments.PaymentListParams.filterStatus": {
        "name": "filter[status]",
        "in": "query",
        "required": false,
        "description": "Return only payments with the given status.",
        "schema": {
          "$ref": "#/components/schemas/BookingPayments.PaymentStatus"
        },
        "explode": false
      },
      "BookingPayments.PaymentListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order payments by insert time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "BookingRevisions.BookingRevisionFeedParams.filterPropertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only revisions belonging to this Property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "BookingRevisions.BookingRevisionFeedParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order revisions by receive time. Defaults to `asc`, oldest first.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "BookingRevisions.BookingRevisionListParams.filterPropertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only revisions belonging to this Property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "BookingRevisions.BookingRevisionListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order revisions by receive time. Defaults to `desc`.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Bookings.BookingListParams.arrivalDateGte": {
        "name": "filter[arrival_date][gte]",
        "in": "query",
        "required": false,
        "description": "Return only bookings with an arrival date at or after this date.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Bookings.BookingListParams.arrivalDateLte": {
        "name": "filter[arrival_date][lte]",
        "in": "query",
        "required": false,
        "description": "Return only bookings with an arrival date at or before this date.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Bookings.BookingListParams.departureDateGte": {
        "name": "filter[departure_date][gte]",
        "in": "query",
        "required": false,
        "description": "Return only bookings with a departure date at or after this date.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Bookings.BookingListParams.departureDateLte": {
        "name": "filter[departure_date][lte]",
        "in": "query",
        "required": false,
        "description": "Return only bookings with a departure date at or before this date.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Bookings.BookingListParams.insertedAtGte": {
        "name": "filter[inserted_at][gte]",
        "in": "query",
        "required": false,
        "description": "Return only bookings received at or after this time.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "Bookings.BookingListParams.insertedAtLte": {
        "name": "filter[inserted_at][lte]",
        "in": "query",
        "required": false,
        "description": "Return only bookings received at or before this time.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "Bookings.BookingListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order bookings by receive time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Common.Pagination.PaginationParams.limit": {
        "name": "pagination[limit]",
        "in": "query",
        "required": false,
        "description": "Number of items per page. Maximum is 100.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.positiveInt",
          "maximum": 100
        },
        "explode": false
      },
      "Common.Pagination.PaginationParams.page": {
        "name": "pagination[page]",
        "in": "query",
        "required": false,
        "description": "Page to return, counted from 1.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.positiveInt"
        },
        "explode": false
      },
      "Facilities.FacilityListParams.filterCategory": {
        "name": "filter[category]",
        "in": "query",
        "required": false,
        "description": "Return only facilities in this category. The value must be one of the categories of the dictionary being queried.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "Facilities.FacilityListParams.orderCategory": {
        "name": "order[category]",
        "in": "query",
        "required": false,
        "description": "Order facilities by category.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Facilities.FacilityListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order facilities by the time they were added to the dictionary.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Facilities.FacilityListParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order facilities by title. This is the default ordering, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Facilities.FacilityOptionsParams.filterCategory": {
        "name": "filter[category]",
        "in": "query",
        "required": false,
        "description": "Return only facilities in this category. The value must be one of the categories of the dictionary being queried.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "Facilities.FacilityOptionsParams.orderCategory": {
        "name": "order[category]",
        "in": "query",
        "required": false,
        "description": "Order facilities by category.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Facilities.FacilityOptionsParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order facilities by the time they were added to the dictionary.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Facilities.FacilityOptionsParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order facilities by title. This is the default ordering, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "GroupUsers.GroupUserListParams": {
        "name": "filter[group_id]",
        "in": "query",
        "required": true,
        "description": "UUID of the group whose users to list.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Groups.GroupListParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order groups by title.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Groups.GroupListParams.title": {
        "name": "filter[title]",
        "in": "query",
        "required": false,
        "description": "Return only groups with exactly this title.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "HotelPolicies.HotelPolicyListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order policies by creation time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "HotelPolicies.HotelPolicyListParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order policies by title. Applied by default, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "HotelPolicies.HotelPolicyListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only policies of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "HotelPolicies.HotelPolicyOptionsParams": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only the policies of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.channel": {
        "name": "filter[channel]",
        "in": "query",
        "required": false,
        "description": "Return only events of channel connections on these channels, by channel\ncode. Accepts several codes separated by commas, and matches regardless of\ncase. Events not tied to a channel connection are excluded, which includes\nevery booking event.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.channelId": {
        "name": "filter[channel_id]",
        "in": "query",
        "required": false,
        "description": "Return only events belonging to this channel connection.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.event": {
        "name": "filter[event]",
        "in": "query",
        "required": false,
        "description": "Return only events of this kind.",
        "schema": {
          "$ref": "#/components/schemas/LiveFeed.LiveFeedEventType"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.groupId": {
        "name": "filter[group_id]",
        "in": "query",
        "required": false,
        "description": "Return only events of Properties in this Group.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.insertedAtFrom": {
        "name": "filter[inserted_at][gte]",
        "in": "query",
        "required": false,
        "description": "Return only events recorded at or after this moment (ISO 8601 without a timezone offset; a date alone is refused).",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.insertedAtTo": {
        "name": "filter[inserted_at][lte]",
        "in": "query",
        "required": false,
        "description": "Return only events recorded at or before this moment (ISO 8601 without a timezone offset; a date alone is refused).",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order events by insertion time. Applied by default, descending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.payloadBookingId": {
        "name": "filter[payload][booking_id]",
        "in": "query",
        "required": false,
        "description": "Return only events whose payload names this booking.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.payloadBookingUniqueId": {
        "name": "filter[payload][booking_unique_id]",
        "in": "query",
        "required": false,
        "description": "Return only events whose payload names this booking, by its human-readable identifier.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.payloadChannelId": {
        "name": "filter[payload][channel_id]",
        "in": "query",
        "required": false,
        "description": "Return only events whose payload names this channel connection. Unlike `filter[channel]`, this reaches booking events.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "LiveFeed.LiveFeedListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only events belonging to this Property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "PaymentApp.PaymentProviderListParams.filterIsActive": {
        "name": "filter[is_active]",
        "in": "query",
        "required": false,
        "description": "Return only active (or only inactive) provider connections.",
        "schema": {
          "type": "boolean"
        },
        "explode": false
      },
      "PaymentApp.PaymentProviderListParams.filterIsDefault": {
        "name": "filter[is_default]",
        "in": "query",
        "required": false,
        "description": "Return only the default (or only non-default) provider connections.",
        "schema": {
          "type": "boolean"
        },
        "explode": false
      },
      "PaymentApp.PaymentProviderListParams.filterProvider": {
        "name": "filter[provider]",
        "in": "query",
        "required": false,
        "description": "Return only connections of the given provider kind.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "PaymentApp.PaymentTransactionListParams.booking_id": {
        "name": "booking_id",
        "in": "query",
        "required": false,
        "description": "Return only transactions of the given booking.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "PaymentApp.PaymentTransactionListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order transactions by insert time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Photos.PhotoListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order photos by creation time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Photos.PhotoListParams.orderPosition": {
        "name": "order[position]",
        "in": "query",
        "required": false,
        "description": "Order photos by their display position.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Photos.PhotoListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only the photos of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Photos.PhotoListParams.roomTypeId": {
        "name": "filter[room_type_id]",
        "in": "query",
        "required": false,
        "description": "Return only the photos of this room type.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Properties.PropertyListParams.city": {
        "name": "filter[city]",
        "in": "query",
        "required": false,
        "description": "Return only properties in exactly this city.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "Properties.PropertyListParams.country": {
        "name": "filter[country]",
        "in": "query",
        "required": false,
        "description": "Return only properties in this country.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.country"
        },
        "explode": false
      },
      "Properties.PropertyListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order properties by creation time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Properties.PropertyListParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order properties by title. Applied by default, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Properties.PropertyListParams.title": {
        "name": "filter[title]",
        "in": "query",
        "required": false,
        "description": "Return only properties with exactly this title.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "PropertyUsers.PropertyUserListParams": {
        "name": "filter[property_id]",
        "in": "query",
        "required": true,
        "description": "UUID of the property whose users to list.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "RatePlans.RatePlanListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order rate plans by creation time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Restrictions.AvailabilityListParams.date": {
        "name": "filter[date]",
        "in": "query",
        "required": false,
        "description": "Single date to load. Give either this or the `gte`/`lte` pair.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Restrictions.AvailabilityListParams.dateGte": {
        "name": "filter[date][gte]",
        "in": "query",
        "required": false,
        "description": "First date of the range to load. Required together with `filter[date][lte]` when `filter[date]` is not given.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Restrictions.AvailabilityListParams.dateLte": {
        "name": "filter[date][lte]",
        "in": "query",
        "required": false,
        "description": "Last date of the range to load, included. Required together with `filter[date][gte]` when `filter[date]` is not given.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Restrictions.AvailabilityListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": true,
        "description": "UUID of the Property whose Room Types to read. Required, and only one id per request is allowed.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Restrictions.RestrictionListParams.date": {
        "name": "filter[date]",
        "in": "query",
        "required": false,
        "description": "Single date to load. Give either this or the `gte`/`lte` pair.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Restrictions.RestrictionListParams.dateGte": {
        "name": "filter[date][gte]",
        "in": "query",
        "required": false,
        "description": "First date of the range to load. Required together with `filter[date][lte]` when `filter[date]` is not given.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Restrictions.RestrictionListParams.dateLte": {
        "name": "filter[date][lte]",
        "in": "query",
        "required": false,
        "description": "Last date of the range to load, included. Required together with `filter[date][gte]` when `filter[date]` is not given.",
        "schema": {
          "type": "string",
          "format": "date"
        },
        "explode": false
      },
      "Restrictions.RestrictionListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": true,
        "description": "UUID of the Property whose Rate Plans to read. Required, and only one id per request is allowed.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Restrictions.RestrictionListParams.restrictions": {
        "name": "filter[restrictions]",
        "in": "query",
        "required": true,
        "description": "Which values to load. Required. Send them comma-separated, or repeat `filter[restrictions][]` once per value; a name outside the set is ignored.",
        "schema": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/Restrictions.RestrictionKind"
          }
        },
        "explode": false
      },
      "RoomTypes.RoomTypeListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only room types of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "RoomTypes.RoomTypeOptionsParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only room types of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyListParams.billingAccountId": {
        "name": "filter[billing_account_id]",
        "in": "query",
        "required": false,
        "description": "Return only keys owned by this billing account. Required unless the caller is an administrator.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyListParams.filterId": {
        "name": "filter[id]",
        "in": "query",
        "required": false,
        "description": "Return only the key with this identifier.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order keys by creation time. Applied by default, descending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyListParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order keys by title.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyListParams.title": {
        "name": "filter[title]",
        "in": "query",
        "required": false,
        "description": "Return only keys with exactly this title.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyOptionsParams.billingAccountId": {
        "name": "filter[billing_account_id]",
        "in": "query",
        "required": false,
        "description": "Return only keys owned by this billing account. Required unless the caller is an administrator.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyOptionsParams.filterId": {
        "name": "filter[id]",
        "in": "query",
        "required": false,
        "description": "Return only the key with this identifier.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyOptionsParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order keys by title. Applied by default, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "SigningKeys.SigningKeyOptionsParams.title": {
        "name": "filter[title]",
        "in": "query",
        "required": false,
        "description": "Return only keys with exactly this title.",
        "schema": {
          "type": "string"
        },
        "explode": false
      },
      "Tasks.TaskListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order tasks by the moment they were recorded. Applied by default, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Tasks.TaskListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only tasks belonging to this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "TaxSets.TaxSetListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order tax sets by creation time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "TaxSets.TaxSetListParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order tax sets by title. Applied by default, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "TaxSets.TaxSetListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only the tax sets of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "TaxSets.TaxSetOptionsParams": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only the tax sets of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Taxes.TaxListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order taxes by creation time.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Taxes.TaxListParams.orderTitle": {
        "name": "order[title]",
        "in": "query",
        "required": false,
        "description": "Order taxes by title. Applied by default, ascending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Taxes.TaxListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only the taxes of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Taxes.TaxOptionsParams": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only the taxes of this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      },
      "Webhooks.WebhookListParams.isActive": {
        "name": "filter[is_active]",
        "in": "query",
        "required": false,
        "description": "Return only active webhooks, or only inactive ones.",
        "schema": {
          "type": "boolean"
        },
        "explode": false
      },
      "Webhooks.WebhookListParams.orderInsertedAt": {
        "name": "order[inserted_at]",
        "in": "query",
        "required": false,
        "description": "Order webhooks by creation time. Applied by default, descending.",
        "schema": {
          "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
        },
        "explode": false
      },
      "Webhooks.WebhookListParams.propertyId": {
        "name": "filter[property_id]",
        "in": "query",
        "required": false,
        "description": "Return only webhooks watching this property.",
        "schema": {
          "$ref": "#/components/schemas/Common.Scalars.id"
        },
        "explode": false
      }
    },
    "schemas": {
      "Applications.Application": {
        "type": "object",
        "required": [
          "code",
          "id",
          "description",
          "title",
          "is_configurable",
          "logo_url",
          "price",
          "representation_settings",
          "vr_price"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "Application code.",
            "examples": [
              "channex_pci"
            ]
          },
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Application identifier. Mirrors the resource `id`."
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Description of the application (HTML). `null` when not provided."
          },
          "title": {
            "type": "string",
            "description": "Application display name.",
            "examples": [
              "Channex PCI"
            ]
          },
          "is_configurable": {
            "type": "boolean",
            "description": "Whether the application has per-installation settings."
          },
          "logo_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL of the application logo. `null` when not provided."
          },
          "price": {},
          "representation_settings": {},
          "vr_price": {}
        },
        "description": "An application available for installation."
      },
      "Applications.ApplicationInstallation": {
        "type": "object",
        "required": [
          "id",
          "property_id",
          "application_id",
          "application_code",
          "settings",
          "inserted_at",
          "is_active"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Installation identifier. Mirrors the resource `id`."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the application is installed on."
          },
          "application_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the installed application. Alternative to `application_code`."
          },
          "application_code": {
            "type": "string",
            "description": "Code of the installed application. Alternative to `application_id`.",
            "examples": [
              "channex_messages"
            ]
          },
          "settings": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Application-specific installation settings. `null` when the application has none."
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the application was installed (ISO 8601, no timezone offset).",
            "examples": [
              "2026-09-22T12:58:10.798350"
            ]
          },
          "is_active": {
            "type": "boolean",
            "description": "Whether the installation is active. Only active installations appear in the installed listing."
          }
        },
        "description": "An application installation."
      },
      "Applications.ApplicationInstallationCreate": {
        "type": "object",
        "required": [
          "property_id"
        ],
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the application is installed on."
          },
          "application_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the installed application. Alternative to `application_code`."
          },
          "application_code": {
            "type": "string",
            "description": "Code of the installed application. Alternative to `application_id`.",
            "examples": [
              "channex_messages"
            ]
          }
        },
        "description": "Attributes accepted when installing an application. The application is identified by `application_id` or `application_code`."
      },
      "Applications.ApplicationInstallationCreateRequest": {
        "type": "object",
        "required": [
          "application_installation"
        ],
        "properties": {
          "application_installation": {
            "$ref": "#/components/schemas/Applications.ApplicationInstallationCreate"
          }
        },
        "description": "Request body accepted when installing an application."
      },
      "Applications.ApplicationInstallationListItem": {
        "type": "object",
        "required": [
          "id",
          "property_id",
          "application_id",
          "application_code",
          "settings",
          "relationships"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Installation identifier. Mirrors the resource `id`."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the application is installed on."
          },
          "application_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the installed application. Alternative to `application_code`."
          },
          "application_code": {
            "type": "string",
            "description": "Code of the installed application. Alternative to `application_id`.",
            "examples": [
              "channex_messages"
            ]
          },
          "settings": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Application-specific installation settings. `null` when the application has none."
          },
          "relationships": {
            "$ref": "#/components/schemas/Applications.ApplicationInstallationRelationships"
          }
        },
        "description": "An application installation as returned by the installed listing."
      },
      "Applications.ApplicationInstallationRelationships": {
        "type": "object",
        "required": [
          "rate_plans"
        ],
        "properties": {
          "rate_plans": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {}
              }
            },
            "required": [
              "data"
            ]
          }
        },
        "description": "Rate plans an installation is linked to."
      },
      "Applications.ApplicationInstallationResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "application_installation"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Applications.ApplicationInstallation"
          },
          "relationships": {
            "$ref": "#/components/schemas/Applications.ApplicationInstallationRelationships"
          }
        },
        "description": "An application installation as returned by the install endpoint."
      },
      "Applications.ApplicationResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "application"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Applications.Application"
          }
        },
        "description": "Application resource. No relationships."
      },
      "Applications.InstalledApplicationResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "application_installation"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Applications.ApplicationInstallationListItem"
          }
        },
        "description": "An installed application as returned by the installed listing."
      },
      "Authentication.CurrentUserRelationships": {
        "type": "object",
        "required": [
          "user_ui_setting"
        ],
        "properties": {
          "user_ui_setting": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Authentication.UserUiSettingRelationship"
              }
            ],
            "description": "UI preferences of the user."
          },
          "organization": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Authentication.OrganizationRelationship"
              }
            ],
            "description": "Organization the user belongs to. Absent for accounts without one."
          }
        },
        "description": "Relationships of the current-user resource."
      },
      "Authentication.CurrentUserResource": {
        "type": "object",
        "required": [
          "type",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "user"
            ]
          },
          "attributes": {
            "$ref": "#/components/schemas/Authentication.User"
          },
          "relationships": {
            "$ref": "#/components/schemas/Authentication.CurrentUserRelationships"
          }
        },
        "description": "The current user. Carries type, attributes and relationships — no id."
      },
      "Authentication.EmbeddedUser": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "user"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Authentication.EmbeddedUserAttributes"
          }
        },
        "description": "A user embedded in another resource's relationships, carrying identifier, name and email."
      },
      "Authentication.EmbeddedUserAttributes": {
        "type": "object",
        "required": [
          "id",
          "name",
          "email"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "User identifier. Mirrors the resource id."
          },
          "name": {
            "type": "string",
            "description": "Display name of the user.",
            "examples": [
              "Channex User"
            ]
          },
          "email": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              }
            ],
            "description": "Email address the account is registered with.",
            "examples": [
              "user@channex.io"
            ]
          }
        },
        "description": "Identifier, display name and email address of an embedded user."
      },
      "Authentication.Organization": {
        "type": "object",
        "required": [
          "id",
          "title",
          "role"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Organization identifier. Mirrors the resource id."
          },
          "title": {
            "type": "string",
            "description": "Organization title.",
            "examples": [
              "Andrew Company"
            ]
          },
          "role": {
            "type": "string",
            "description": "Role of the user within the organization.",
            "examples": [
              "owner"
            ]
          }
        },
        "description": "An organization the user belongs to."
      },
      "Authentication.OrganizationRelationship": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "attributes": {
                "$ref": "#/components/schemas/Authentication.Organization"
              },
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "type": {
                "type": "string",
                "enum": [
                  "organization"
                ]
              }
            },
            "required": [
              "attributes",
              "id",
              "type"
            ]
          }
        },
        "description": "An organization embedded as a relationship, attributes included."
      },
      "Authentication.PreferredLanguage": {
        "type": "string",
        "enum": [
          "ar",
          "de",
          "el",
          "en",
          "es",
          "fr",
          "hu",
          "it",
          "nl",
          "pt",
          "pt_BR",
          "ru",
          "sv",
          "th"
        ],
        "description": "Interface language of a user account."
      },
      "Authentication.SystemRole": {
        "type": "string",
        "enum": [
          "user",
          "admin",
          "api"
        ],
        "description": "System-wide role of a user account."
      },
      "Authentication.User": {
        "type": "object",
        "required": [
          "id",
          "name",
          "email",
          "settings",
          "preferred_language",
          "is_api_key_allowed",
          "signed_agreement_version",
          "system_role"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "User identifier. Mirrors the resource id."
          },
          "name": {
            "type": "string",
            "description": "Display name of the user.",
            "examples": [
              "Andrew"
            ]
          },
          "email": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              }
            ],
            "description": "Email address the account is registered with."
          },
          "settings": {
            "$ref": "#/components/schemas/Authentication.UserSettings"
          },
          "preferred_language": {
            "$ref": "#/components/schemas/Authentication.PreferredLanguage"
          },
          "is_api_key_allowed": {
            "type": "boolean",
            "description": "Whether the user may create and use API keys."
          },
          "signed_agreement_version": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Version of the user agreement the user has signed. `null` when no agreement has been signed yet."
          },
          "system_role": {
            "$ref": "#/components/schemas/Authentication.SystemRole"
          }
        },
        "description": "A user account."
      },
      "Authentication.UserSettings": {
        "type": "object",
        "properties": {
          "block_booking_export": {
            "type": "boolean",
            "description": "Whether booking exports are blocked for the user."
          },
          "allow_airbnb_rate_plans": {
            "type": "boolean",
            "description": "Whether the user may manage Airbnb rate plans."
          }
        },
        "description": "Per-user feature switches. Empty for accounts with no switches set."
      },
      "Authentication.UserUiSetting": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "show_notifications"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UI settings record identifier. Mirrors the resource id."
          },
          "user_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the user the settings belong to."
          },
          "show_notifications": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether in-app notifications are shown to the user. `null` when the preference has not been set."
          }
        },
        "description": "UI preferences of a user account."
      },
      "Authentication.UserUiSettingRelationship": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "attributes": {
                "$ref": "#/components/schemas/Authentication.UserUiSetting"
              },
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "type": {
                "type": "string",
                "enum": [
                  "user_ui_setting"
                ]
              }
            },
            "required": [
              "attributes",
              "id",
              "type"
            ]
          }
        },
        "description": "A user's UI settings embedded as a relationship, attributes included."
      },
      "AuthorizeNet.AuthorizeNetBillingDetails": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": "string",
            "examples": [
              "John"
            ]
          },
          "last_name": {
            "type": "string",
            "examples": [
              "Doe"
            ]
          },
          "address": {
            "type": "string",
            "description": "Street address.",
            "examples": [
              "173 Yonge St"
            ]
          },
          "city": {
            "type": "string",
            "examples": [
              "Toronto"
            ]
          },
          "state": {
            "type": "string",
            "description": "State or province.",
            "examples": [
              "ON"
            ]
          },
          "zip": {
            "type": "string",
            "description": "Postal or ZIP code.",
            "examples": [
              "M5B 2L7"
            ]
          },
          "country": {
            "type": "string",
            "examples": [
              "Canada"
            ]
          }
        },
        "description": "Billing details of the card holder."
      },
      "AuthorizeNet.AuthorizeNetCustomerDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "data": {
            "type": "object",
            "properties": {
              "customer_profile_id": {
                "type": "string",
                "description": "Identifier of the Authorize.net customer profile holding the booking's tokenized card.",
                "examples": [
                  "524481282"
                ]
              }
            },
            "required": [
              "customer_profile_id"
            ]
          }
        },
        "description": "Response document carrying an Authorize.net customer profile reference."
      },
      "AuthorizeNet.AuthorizeNetCustomerRequest": {
        "type": "object",
        "properties": {
          "billing_details": {
            "$ref": "#/components/schemas/AuthorizeNet.AuthorizeNetBillingDetails"
          }
        },
        "description": "Request body of the customer profile endpoint. Send `billing_details` only when the Property's Authorize.net account requires them."
      },
      "BookingPayments.Payment": {
        "type": "object",
        "required": [
          "id",
          "booking_id",
          "amount",
          "currency",
          "status",
          "inserted_at",
          "updated_at",
          "transactions"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Payment identifier. Mirrors the resource id."
          },
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking the payment belongs to."
          },
          "amount": {
            "type": "string",
            "description": "Payment amount as a decimal string.",
            "examples": [
              "100.11"
            ]
          },
          "currency": {
            "type": "string",
            "description": "Currency of the payment.",
            "examples": [
              "USD"
            ]
          },
          "status": {
            "$ref": "#/components/schemas/BookingPayments.PaymentStatus"
          },
          "description": {
            "type": "string",
            "description": "Free-form payment description.",
            "examples": [
              "Test payment"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "transactions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingPayments.PaymentTransaction"
            },
            "description": "Operations performed within the payment (charges, pre-auths, refunds, voids)."
          }
        },
        "description": "A payment of a booking."
      },
      "BookingPayments.PaymentAmountRequest": {
        "type": "object",
        "required": [
          "amount",
          "payment_provider_id"
        ],
        "properties": {
          "amount": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "description": "Amount to process, as a decimal string or an integer.",
            "examples": [
              "100.5"
            ]
          },
          "payment_provider_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the payment provider to process the payment with."
          },
          "description": {
            "type": "string",
            "description": "Free-form payment description."
          }
        },
        "description": "Request body for `POST /bookings/{booking_id}/pre_auth_payment` and `POST /bookings/{booking_id}/charge_payment`."
      },
      "BookingPayments.PaymentBookingRelationship": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "type": {
                "type": "string",
                "enum": [
                  "booking"
                ]
              },
              "attributes": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "reference": {
                    "type": "string",
                    "description": "Booking reference."
                  }
                },
                "required": [
                  "id",
                  "reference"
                ]
              }
            },
            "required": [
              "id",
              "type",
              "attributes"
            ]
          }
        },
        "description": "The booking a payment belongs to, embedded as a relationship."
      },
      "BookingPayments.PaymentDocument": {
        "type": "object",
        "required": [
          "meta",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "meta": {
            "$ref": "#/components/schemas/BookingPayments.PaymentMeta"
          },
          "data": {
            "$ref": "#/components/schemas/BookingPayments.PaymentResource"
          }
        },
        "description": "Response document for a payment returned by a payment action."
      },
      "BookingPayments.PaymentIdRequest": {
        "type": "object",
        "required": [
          "payment_id"
        ],
        "properties": {
          "payment_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the pre-authorized payment to act on."
          },
          "description": {
            "type": "string",
            "description": "Free-form payment description."
          }
        },
        "description": "Request body for `POST /bookings/{booking_id}/settle_payment` and `POST /bookings/{booking_id}/void_payment`."
      },
      "BookingPayments.PaymentListDocument": {
        "type": "object",
        "required": [
          "meta",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "meta": {
            "$ref": "#/components/schemas/BookingPayments.PaymentMeta"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingPayments.PaymentResource"
            }
          }
        },
        "description": "Response document for the payment list of a booking."
      },
      "BookingPayments.PaymentMeta": {
        "type": "object",
        "required": [
          "total",
          "limit",
          "page",
          "order_by",
          "order_direction"
        ],
        "properties": {
          "total": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "examples": [
              1
            ]
          },
          "limit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "examples": [
              10
            ]
          },
          "page": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "examples": [
              1
            ]
          },
          "order_by": {
            "type": "string",
            "description": "Field the results are ordered by.",
            "examples": [
              "inserted_at"
            ]
          },
          "order_direction": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
              }
            ],
            "description": "Direction the results are ordered in."
          }
        },
        "description": "Pagination and ordering metadata of payment responses."
      },
      "BookingPayments.PaymentProviderRelationship": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "type": {
                "type": "string",
                "enum": [
                  "payment_provider"
                ]
              },
              "attributes": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "title": {
                    "type": "string",
                    "description": "Provider connection title."
                  },
                  "is_active": {
                    "type": "boolean",
                    "description": "Whether the provider connection is active."
                  },
                  "is_default": {
                    "type": "boolean",
                    "description": "Whether the provider connection is the default one."
                  },
                  "provider": {
                    "type": "string",
                    "description": "Payment provider kind.",
                    "examples": [
                      "stripe"
                    ]
                  },
                  "details": {
                    "type": "object",
                    "unevaluatedProperties": {},
                    "description": "Provider-specific connection details.",
                    "examples": [
                      {
                        "account_id": "xyz123"
                      }
                    ]
                  }
                },
                "required": [
                  "id",
                  "title",
                  "is_active",
                  "is_default",
                  "provider"
                ]
              }
            },
            "required": [
              "id",
              "type",
              "attributes"
            ]
          }
        },
        "description": "The payment provider of a payment, embedded as a relationship."
      },
      "BookingPayments.PaymentRelationships": {
        "type": "object",
        "required": [
          "users",
          "booking",
          "payment_provider"
        ],
        "properties": {
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Authentication.EmbeddedUser"
            },
            "description": "Users involved in the payment's transactions."
          },
          "booking": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingPayments.PaymentBookingRelationship"
              }
            ],
            "description": "The booking the payment belongs to."
          },
          "payment_provider": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingPayments.PaymentProviderRelationship"
              }
            ],
            "description": "The payment provider of the payment."
          }
        },
        "description": "Relationships of a payment resource."
      },
      "BookingPayments.PaymentResource": {
        "type": "object",
        "required": [
          "id",
          "type",
          "attributes",
          "relationships"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "payment"
            ]
          },
          "attributes": {
            "$ref": "#/components/schemas/BookingPayments.Payment"
          },
          "relationships": {
            "$ref": "#/components/schemas/BookingPayments.PaymentRelationships"
          }
        },
        "description": "Payment resource."
      },
      "BookingPayments.PaymentStatus": {
        "type": "string",
        "enum": [
          "charged",
          "refunded",
          "pre_authorized",
          "cancelled",
          "partially_refunded"
        ],
        "description": "Lifecycle status of a payment."
      },
      "BookingPayments.PaymentTransaction": {
        "type": "object",
        "required": [
          "id",
          "type",
          "currency",
          "amount",
          "ip_address",
          "booking_id",
          "user_id",
          "payment_provider_id",
          "inserted_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "$ref": "#/components/schemas/BookingPayments.PaymentTransactionType"
          },
          "currency": {
            "type": "string",
            "description": "Currency of the transaction.",
            "examples": [
              "USD"
            ]
          },
          "amount": {
            "type": "string",
            "description": "Transaction amount as a decimal string.",
            "examples": [
              "100.11"
            ]
          },
          "ip_address": {
            "type": "string",
            "description": "IP address the transaction was initiated from.",
            "examples": [
              "185.229.190.76"
            ]
          },
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking the transaction belongs to."
          },
          "user_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the user who initiated the transaction."
          },
          "payment_provider_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the payment provider that processed the transaction."
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Provider-specific transaction details.",
            "examples": [
              {
                "id": "pi123"
              }
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "description": "A single operation performed within a payment."
      },
      "BookingPayments.PaymentTransactionType": {
        "type": "string",
        "enum": [
          "charge",
          "pre_auth",
          "refund",
          "void"
        ],
        "description": "Kind of a payment transaction."
      },
      "BookingPayments.RefundPaymentRequest": {
        "type": "object",
        "required": [
          "payment_id",
          "amount"
        ],
        "properties": {
          "payment_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the charged payment to refund."
          },
          "amount": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ],
            "description": "Amount to refund, as a decimal string or an integer.",
            "examples": [
              "100.5"
            ]
          },
          "description": {
            "type": "string",
            "description": "Free-form payment description."
          }
        },
        "description": "Request body for `POST /bookings/{booking_id}/refund_payment`."
      },
      "BookingRevisions.AcknowledgeStatus": {
        "type": "string",
        "enum": [
          "pending",
          "acknowledged"
        ],
        "description": "Whether the revision has been acknowledged by the consumer."
      },
      "BookingRevisions.BookingCollectedTax": {
        "type": "object",
        "required": [
          "name",
          "type",
          "total_price",
          "is_inclusive"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax type, as a display name.",
            "examples": [
              "City Tax"
            ]
          },
          "total_price": {
            "type": "string",
            "description": "Total price of the tax as a decimal string.",
            "examples": [
              "2.92"
            ]
          },
          "is_inclusive": {
            "type": "boolean",
            "description": "Whether the tax is included in the room price."
          },
          "price_per_unit": {
            "type": "string",
            "description": "Price per unit as a decimal string."
          },
          "price_mode": {
            "type": "string",
            "description": "How the tax is applied (e.g. `Per booking`)."
          },
          "nights": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of nights the tax applies to."
          },
          "persons": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of persons the tax applies to."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax record version."
          },
          "is_withheld": {
            "type": "boolean",
            "description": "Always `true` on a collected tax."
          }
        },
        "description": "A tax already collected by the OTA — also known as a withheld tax."
      },
      "BookingRevisions.BookingCustomer": {
        "type": "object",
        "required": [
          "name",
          "surname",
          "mail",
          "phone",
          "language",
          "country",
          "city",
          "address",
          "zip"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "surname": {
            "type": "string"
          },
          "mail": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              },
              {
                "type": "null"
              }
            ]
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "country": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.country"
              },
              {
                "type": "null"
              }
            ]
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "zip": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "state": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Not present in every response variant."
          },
          "company": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Not present in every response variant."
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form OTA-specific details (e.g. Booking.com `is_genius`)."
          }
        },
        "description": "Information about the customer who made the booking."
      },
      "BookingRevisions.BookingGuarantee": {
        "type": "object",
        "required": [
          "card_number",
          "card_type",
          "cardholder_name",
          "cvv",
          "expiration_date",
          "is_virtual"
        ],
        "properties": {
          "card_number": {
            "type": "string",
            "description": "Masked credit card number.",
            "examples": [
              "411111******1111"
            ]
          },
          "card_type": {
            "$ref": "#/components/schemas/BookingRevisions.CardType"
          },
          "cardholder_name": {
            "type": "string"
          },
          "cvv": {
            "type": "string",
            "description": "Masked CVV / CVC. Always `***` for non-secure connections."
          },
          "expiration_date": {
            "type": "string",
            "description": "Credit card expiration date in `MM/YYYY` format.",
            "examples": [
              "12/2021"
            ]
          },
          "is_virtual": {
            "type": "boolean",
            "description": "Whether the card is a virtual credit card."
          },
          "token": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Card token."
          },
          "meta": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingGuaranteeMeta"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "description": "Credit card provided as payment guarantee.\n\nFull card details are returned only to certified PCI DSS partners, and only over\nthe secure endpoints: `secure-staging.channex.io` on staging and\n`secure.channex.io` in production. To be granted access, write to\nsupport@channex.io with the IP addresses to whitelist and your PCI DSS\ncertificate. Over any other endpoint the card number and CVV arrive masked."
      },
      "BookingRevisions.BookingGuaranteeMeta": {
        "type": "object",
        "properties": {
          "virtual_card_currency_code": {
            "type": "string",
            "description": "Currency of the virtual credit card."
          },
          "virtual_card_current_balance": {
            "type": "string",
            "description": "Initial balance on the virtual credit card, as a string."
          },
          "virtual_card_decimal_places": {
            "type": "string",
            "description": "Count of decimal places of the balance value."
          },
          "virtual_card_effective_date": {
            "type": "string",
            "description": "Date the virtual credit card becomes active for charges."
          },
          "virtual_card_expiration_date": {
            "type": "string",
            "description": "Virtual credit card expiration date."
          }
        },
        "description": "Additional virtual-card details of a guarantee. Available only for Booking.com and some Expedia bookings."
      },
      "BookingRevisions.BookingGuest": {
        "type": "object",
        "required": [
          "name",
          "surname"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "surname": {
            "type": "string"
          }
        },
        "description": "A guest of a booking room. Name and surname are provided when the OTA exposes them."
      },
      "BookingRevisions.BookingOccupancy": {
        "type": "object",
        "required": [
          "adults",
          "children",
          "infants"
        ],
        "properties": {
          "adults": {
            "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
          },
          "children": {
            "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
          },
          "infants": {
            "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
          },
          "ages": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Ages of the children, when `children` is not 0. Can be `null` in room occupancies."
          }
        },
        "description": "Occupancy breakdown by guest kind."
      },
      "BookingRevisions.BookingRevision": {
        "type": "object",
        "required": [
          "id",
          "booking_id",
          "property_id",
          "channel_id",
          "unique_id",
          "system_id",
          "ota_reservation_code",
          "ota_name",
          "secondary_ota",
          "status",
          "acknowledge_status",
          "rooms",
          "services",
          "guarantee",
          "customer",
          "occupancy",
          "arrival_date",
          "departure_date",
          "arrival_hour",
          "amount",
          "currency",
          "notes",
          "deposits",
          "agent",
          "payment_collect",
          "payment_type",
          "ota_commission",
          "inserted_at",
          "meta",
          "raw_message",
          "is_crs_revision"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique booking revision identifier.",
            "examples": [
              "c64a3a6e-e38f-436e-a72e-8bd7e619b6fc"
            ]
          },
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the associated Booking."
          },
          "property_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the associated Property. `null` for unmapped bookings."
          },
          "channel_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the associated Channel, when known."
          },
          "unique_id": {
            "type": "string",
            "description": "Unique booking identifier combined from the OTA code and the OTA reservation code. Usually the same for all revisions of a booking.",
            "examples": [
              "BDC-4072171540"
            ]
          },
          "system_id": {
            "type": "string",
            "description": "Unique message identifier at the booking source platform, unique per revision. Used for message deduplication."
          },
          "ota_reservation_code": {
            "type": "string",
            "description": "Original reservation code at the platform where the guest created the booking. Unique per booking message."
          },
          "ota_name": {
            "type": "string",
            "description": "Name of the OTA where the booking was originally created.",
            "examples": [
              "BookingCom"
            ]
          },
          "secondary_ota": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Secondary OTA the booking came through, when applicable (e.g. `MakeMyTrip`)."
          },
          "status": {
            "$ref": "#/components/schemas/BookingRevisions.BookingRevisionStatus"
          },
          "acknowledge_status": {
            "$ref": "#/components/schemas/BookingRevisions.AcknowledgeStatus"
          },
          "rooms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingRoom"
            },
            "description": "Booking rooms. Can be empty (e.g. cancellation revisions)."
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingService"
            },
            "description": "Services at booking level."
          },
          "guarantee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingGuarantee"
              },
              {
                "type": "null"
              }
            ],
            "description": "Credit card provided as payment guarantee, when present."
          },
          "customer": {
            "$ref": "#/components/schemas/BookingRevisions.BookingCustomer"
          },
          "occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingOccupancy"
              }
            ],
            "description": "Total booking occupancy."
          },
          "arrival_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival date (`YYYY-MM-DD`). Can be `null` on cancellation revisions."
          },
          "departure_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Departure date (`YYYY-MM-DD`). Can be `null` on cancellation revisions."
          },
          "arrival_hour": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival time in `HH:MM` (24h) format.",
            "examples": [
              "02:00"
            ]
          },
          "amount": {
            "type": "string",
            "description": "Total booking amount as a decimal string.",
            "examples": [
              "400.00"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Booking currency code."
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Customer notes for the booking."
          },
          "deposits": {
            "type": "array",
            "items": {},
            "description": "Deposits associated with the booking."
          },
          "agent": {
            "description": "Agent the booking was made through."
          },
          "payment_collect": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentCollect"
              },
              {
                "type": "null"
              }
            ]
          },
          "payment_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentType"
              },
              {
                "type": "null"
              }
            ]
          },
          "ota_commission": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Commission amount charged by the OTA, as a decimal string. Currently available for Booking.com and Airbnb channels.",
            "examples": [
              "0.00"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the revision was received at Channex (ISO 8601, no timezone offset).",
            "examples": [
              "2026-07-21T12:12:36.919641"
            ]
          },
          "meta": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Free-form revision meta (e.g. `ruid`, `converter_version`, `source`)."
          },
          "raw_message": {
            "type": "string",
            "description": "Raw message received from the booking source, as a string (JSON or OTA-specific payload)."
          },
          "is_crs_revision": {
            "type": "boolean",
            "description": "Whether the revision was produced by the CRS (e.g. via the Bookings API) rather than received from an OTA feed."
          }
        },
        "description": "A booking revision — an immutable snapshot of a booking received from a booking source (a new booking, a modification, or a cancellation)."
      },
      "BookingRevisions.BookingRevisionRelationships": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "property": {
                "type": "object",
                "properties": {
                  "id": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/Common.Scalars.id"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "property"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ],
                "description": "Property the booking belongs to. `id` is `null` for unmapped bookings."
              },
              "booking": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "booking"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ],
                "description": "Booking the revision belongs to."
              }
            },
            "required": [
              "property",
              "booking"
            ]
          }
        },
        "description": "Relationships of a booking revision resource (non-standard layout)."
      },
      "BookingRevisions.BookingRevisionStatus": {
        "type": "string",
        "enum": [
          "new",
          "modified",
          "cancelled"
        ],
        "description": "Status of a booking revision."
      },
      "BookingRevisions.BookingRoom": {
        "type": "object",
        "required": [
          "booking_room_id",
          "room_type_id",
          "rate_plan_id",
          "checkin_date",
          "checkout_date",
          "occupancy",
          "guests",
          "services",
          "taxes",
          "amount",
          "days",
          "ota_commission",
          "ota_unique_id",
          "is_cancelled",
          "meta"
        ],
        "properties": {
          "booking_room_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique booking room identifier."
          },
          "room_type_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "Associated Room Type. `null` when the room is not mapped."
          },
          "rate_plan_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "Associated Rate Plan. `null` when the room is not mapped."
          },
          "checkin_date": {
            "type": "string",
            "format": "date",
            "description": "Check-in date (`YYYY-MM-DD`)."
          },
          "checkout_date": {
            "type": "string",
            "format": "date",
            "description": "Check-out date (`YYYY-MM-DD`)."
          },
          "occupancy": {
            "$ref": "#/components/schemas/BookingRevisions.BookingOccupancy"
          },
          "guests": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/BookingRevisions.BookingGuest"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Guests of the room, when the OTA exposes them; `null` otherwise."
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingService"
            },
            "description": "Services at room level."
          },
          "taxes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingRoomTax"
            }
          },
          "collected_taxes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingCollectedTax"
            },
            "description": "Taxes already collected by the OTA, when the booking source reports any. Reported by Booking.com and Airbnb."
          },
          "amount": {
            "type": "string",
            "description": "Total booking room amount as a decimal string.",
            "examples": [
              "400.00"
            ]
          },
          "days": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "string"
            },
            "description": "Price breakdown per stay date: `YYYY-MM-DD` → decimal string amount."
          },
          "ota_commission": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "OTA commission for the room as a decimal string, when available."
          },
          "ota_unique_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Unique room ID at the OTA side. Available for a limited set of OTAs (currently Booking.com)."
          },
          "is_cancelled": {
            "type": "boolean"
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form meta information (mapping, rate codes, cancel penalties, day breakdowns, policies, …). Can contain `parent_rate_plan_id` when the room is associated with a derived rate plan or occupancy option."
          }
        },
        "description": "A room of a booking."
      },
      "BookingRevisions.BookingRoomTax": {
        "type": "object",
        "required": [
          "name",
          "type",
          "total_price",
          "is_inclusive"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax type, as a display name.",
            "examples": [
              "City Tax"
            ]
          },
          "total_price": {
            "type": "string",
            "description": "Total price of the tax as a decimal string.",
            "examples": [
              "2.92"
            ]
          },
          "is_inclusive": {
            "type": "boolean",
            "description": "Whether the tax is included in the room price."
          },
          "price_per_unit": {
            "type": "string",
            "description": "Price per unit as a decimal string."
          },
          "price_mode": {
            "type": "string",
            "description": "How the tax is applied (e.g. `Per booking`)."
          },
          "nights": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of nights the tax applies to."
          },
          "persons": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of persons the tax applies to."
          },
          "version": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax record version."
          }
        },
        "description": "A tax associated with a booking room."
      },
      "BookingRevisions.BookingService": {
        "type": "object",
        "required": [
          "name",
          "type",
          "price_mode",
          "price_per_unit",
          "total_price",
          "nights",
          "persons",
          "is_inclusive"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Service name in English.",
            "examples": [
              "Cancellation Fee"
            ]
          },
          "type": {
            "type": "string",
            "description": "Kind of service, e.g. `Breakfast`, `Internet`, `Parking`. Free-form OTA-provided value.",
            "examples": [
              "Breakfast"
            ]
          },
          "price_mode": {
            "type": "string",
            "description": "How the price is applied. Free-form OTA-provided value with inconsistent casing (e.g. `Per stay`, `per_booking`).",
            "examples": [
              "Per stay"
            ]
          },
          "price_per_unit": {
            "type": "string",
            "description": "Price per unit as a decimal string.",
            "examples": [
              "1500.00"
            ]
          },
          "total_price": {
            "type": "string",
            "description": "Total calculated price as a decimal string.",
            "examples": [
              "1500.00"
            ]
          },
          "nights": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of nights the service is booked for."
          },
          "persons": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of persons the service is booked for."
          },
          "is_inclusive": {
            "type": "boolean",
            "description": "Whether the service price is included in the booking price."
          },
          "service_rph": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Service RPH reference."
          }
        },
        "description": "A service (extra charge) attached to a booking or a booking room."
      },
      "BookingRevisions.CardType": {
        "type": "string",
        "enum": [
          "unknown",
          "AX",
          "BC",
          "BL",
          "CU",
          "DN",
          "DS",
          "EL",
          "JC",
          "MA",
          "MC",
          "MI",
          "VI"
        ],
        "description": "Card type code of a payment guarantee:\n\n| Code | Card |\n| --- | --- |\n| `unknown` | Card code is not known |\n| `AX` | American Express |\n| `BC` | Bank Card |\n| `BL` | Carte Bancaire |\n| `CU` | Unionpay Credit Card |\n| `DN` | Diners Club |\n| `DS` | Discover Card |\n| `EL` | Elo |\n| `JC` | Japanese Credit Bureau Credit Card |\n| `MA` | Maestro |\n| `MC` | Master Card |\n| `MI` | NSPK MIR |\n| `VI` | Visa |"
      },
      "BookingRevisions.PaymentCollect": {
        "type": "string",
        "enum": [
          "property",
          "ota"
        ],
        "description": "Who collects the payment: the property or the OTA (guest already paid at the OTA). `null` usually means the property collects it."
      },
      "BookingRevisions.PaymentType": {
        "type": "string",
        "enum": [
          "credit_card",
          "bank_transfer"
        ],
        "description": "How the payment is collected: a credit card associated with the booking, or a bank transfer from the OTA."
      },
      "Bookings.Booking": {
        "type": "object",
        "required": [
          "id",
          "booking_id",
          "revision_id",
          "channel_id",
          "unique_id",
          "secondary_ota",
          "acknowledge_status",
          "has_unacked_revisions",
          "amount",
          "occupancy",
          "guarantee",
          "agent",
          "raw_message",
          "is_crs_revision",
          "inserted_at",
          "status",
          "property_id",
          "arrival_date",
          "departure_date",
          "ota_name",
          "currency",
          "ota_reservation_code",
          "arrival_hour",
          "services",
          "payment_collect",
          "payment_type",
          "ota_commission",
          "notes",
          "meta",
          "customer",
          "rooms",
          "deposits"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique booking identifier.",
            "examples": [
              "603e8e9e-cc67-4ca7-bd13-3c407c6c3bbd"
            ]
          },
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique booking identifier (same as `id`)."
          },
          "revision_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the latest revision of the booking."
          },
          "channel_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the associated Channel, when known."
          },
          "unique_id": {
            "type": "string",
            "description": "Unique booking identifier combined from the OTA code and the OTA reservation code.",
            "examples": [
              "BDC-1556013801"
            ]
          },
          "secondary_ota": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Secondary OTA the booking came through, when applicable (e.g. `MakeMyTrip`)."
          },
          "acknowledge_status": {
            "$ref": "#/components/schemas/BookingRevisions.AcknowledgeStatus"
          },
          "has_unacked_revisions": {
            "type": "boolean",
            "description": "Whether the booking has revisions that have not been acknowledged yet."
          },
          "amount": {
            "type": "string",
            "description": "Total booking amount as a decimal string.",
            "examples": [
              "220.00"
            ]
          },
          "occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingOccupancy"
              }
            ],
            "description": "Total booking occupancy."
          },
          "guarantee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingGuarantee"
              },
              {
                "type": "null"
              }
            ],
            "description": "Credit card provided as payment guarantee, when present."
          },
          "agent": {
            "description": "Agent the booking was made through."
          },
          "raw_message": {
            "type": "string",
            "description": "Raw message received from the booking source, as a string (JSON or OTA-specific payload)."
          },
          "is_crs_revision": {
            "type": "boolean",
            "description": "Whether the latest revision was produced by the CRS (e.g. via this API) rather than received from an OTA feed."
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the booking was received at Channex (ISO 8601, no timezone offset).",
            "examples": [
              "2019-04-23T10:03:29.335485"
            ]
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingRevisionStatus"
              }
            ],
            "description": "Status of the booking, matching its latest revision."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the booking belongs to."
          },
          "arrival_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival date (`YYYY-MM-DD`)."
          },
          "departure_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Departure date (`YYYY-MM-DD`)."
          },
          "ota_name": {
            "type": "string",
            "description": "Name of the booking source.",
            "examples": [
              "Booking.com"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Booking currency code."
          },
          "ota_reservation_code": {
            "type": "string",
            "description": "Original reservation code at the platform where the guest created the booking.",
            "examples": [
              "113"
            ]
          },
          "arrival_hour": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival time in `HH:MM` (24h) format.",
            "examples": [
              "10:00"
            ]
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingService"
            },
            "description": "Services at booking level."
          },
          "payment_collect": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentCollect"
              },
              {
                "type": "null"
              }
            ]
          },
          "payment_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentType"
              },
              {
                "type": "null"
              }
            ]
          },
          "ota_commission": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Commission amount charged by the OTA, as a decimal string. Currently available for Booking.com and Airbnb channels.",
            "examples": [
              "10.00"
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Customer notes for the booking."
          },
          "meta": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Free-form custom meta-information to exchange with integrated partners."
          },
          "customer": {
            "$ref": "#/components/schemas/BookingRevisions.BookingCustomer"
          },
          "rooms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingRoom"
            },
            "description": "Booking rooms."
          },
          "deposits": {
            "type": "array",
            "items": {},
            "description": "Deposits associated with the booking."
          }
        },
        "description": "A booking — the current state of a reservation, reflecting its latest revision."
      },
      "Bookings.BookingComAmount": {
        "type": "object",
        "required": [
          "currency",
          "decimals",
          "value"
        ],
        "properties": {
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "ISO 4217 currency code.",
            "examples": [
              "GBP"
            ]
          },
          "decimals": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of decimal places in `value`."
          },
          "value": {
            "type": "string",
            "description": "Amount digits, without a decimal separator.",
            "examples": [
              "1575"
            ]
          }
        },
        "description": "Monetary amount in Booking.com's fixed-point format: the amount equals `value` divided by 10 to the power of `decimals` — e.g. `value` `\"1575\"` with `decimals` `2` is 15.75."
      },
      "Bookings.BookingComApplicableRate": {
        "type": "object",
        "required": [
          "decimals",
          "type",
          "value"
        ],
        "properties": {
          "decimals": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of decimal places in `value`."
          },
          "type": {
            "type": "string",
            "description": "Rate type. Possible values: `PERCENTAGE`."
          },
          "value": {
            "type": "string",
            "description": "Rate digits, without a decimal separator.",
            "examples": [
              "20"
            ]
          }
        },
        "description": "Rate a charge is calculated from, in the same fixed-point format as monetary amounts: the rate equals `value` divided by 10 to the power of `decimals`."
      },
      "Bookings.BookingComBankTransfer": {
        "type": "object",
        "required": [
          "amount",
          "payout_date",
          "status"
        ],
        "properties": {
          "amount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Bookings.BookingComAmount"
              }
            ],
            "description": "Payout amount."
          },
          "payout_date": {
            "type": "string",
            "format": "date",
            "description": "Date the payout is scheduled for (`YYYY-MM-DD`)."
          },
          "status": {
            "type": "string",
            "description": "Payout status. Possible values: `PENDING`."
          }
        },
        "description": "A scheduled bank-transfer payout."
      },
      "Bookings.BookingComBankTransferPayout": {
        "type": "object",
        "required": [
          "payout",
          "payout_type",
          "property_id",
          "reservation_id"
        ],
        "properties": {
          "payout": {
            "type": "object",
            "properties": {
              "bank_transfers": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Bookings.BookingComBankTransfer"
                },
                "description": "Scheduled bank-transfer payouts."
              }
            },
            "required": [
              "bank_transfers"
            ],
            "description": "Payouts."
          },
          "payout_type": {
            "type": "string",
            "description": "Payout model. Possible values: `GROSS`."
          },
          "property_id": {
            "type": "string",
            "description": "Booking.com property (hotel) identifier.",
            "examples": [
              "36364"
            ]
          },
          "reservation_id": {
            "type": "string",
            "description": "Booking.com reservation identifier.",
            "examples": [
              "5741260940"
            ]
          }
        },
        "description": "Bank-transfer payout state of a Booking.com reservation."
      },
      "Bookings.BookingComCharge": {
        "type": "object",
        "required": [
          "amount",
          "applicable_rate",
          "applicable_type",
          "is_already_collected_from_guest",
          "is_included_total_partner_payout",
          "type"
        ],
        "properties": {
          "amount": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Bookings.BookingComAmount"
              }
            ],
            "description": "Charge amount."
          },
          "applicable_rate": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Bookings.BookingComApplicableRate"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rate the charge is calculated from. `null` for fixed charges."
          },
          "applicable_type": {},
          "is_already_collected_from_guest": {
            "type": "string",
            "description": "Whether the charge has already been collected from the guest. String-encoded boolean.",
            "examples": [
              "TRUE"
            ]
          },
          "is_included_total_partner_payout": {
            "type": "string",
            "description": "Whether the charge is included in the total partner payout. String-encoded boolean.",
            "examples": [
              "TRUE"
            ]
          },
          "type": {
            "type": "string",
            "description": "Charge type. Possible values: `VAT`, `COMMISSION`, `PAYMENT CHARGE`."
          }
        },
        "description": "A single commission or charge applied to a room reservation."
      },
      "Bookings.BookingComPartnerPayout": {
        "type": "object",
        "required": [
          "commissionable_price",
          "commissions_and_charges",
          "total_payout"
        ],
        "properties": {
          "commissionable_price": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Bookings.BookingComAmount"
              }
            ],
            "description": "Price the commission is calculated on."
          },
          "commissions_and_charges": {
            "type": "object",
            "properties": {
              "currency": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Common.Scalars.currency"
                  }
                ],
                "description": "ISO 4217 currency code.",
                "examples": [
                  "GBP"
                ]
              },
              "decimals": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                  }
                ],
                "description": "Number of decimal places in `value`."
              },
              "value": {
                "type": "string",
                "description": "Amount digits, without a decimal separator.",
                "examples": [
                  "1575"
                ]
              },
              "breakdown": {
                "type": "object",
                "properties": {
                  "total_charges": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/Bookings.BookingComAmount"
                      }
                    ],
                    "description": "Total charges."
                  },
                  "total_commissions": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/Bookings.BookingComAmount"
                      }
                    ],
                    "description": "Total commissions."
                  }
                },
                "required": [
                  "total_charges",
                  "total_commissions"
                ]
              }
            },
            "required": [
              "currency",
              "decimals",
              "value",
              "breakdown"
            ],
            "description": "Total commissions and charges deducted from the payout."
          },
          "total_payout": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Bookings.BookingComAmount"
              }
            ],
            "description": "Total amount paid out to the property."
          }
        },
        "description": "Summary of the payout Booking.com sends to the property."
      },
      "Bookings.BookingComPayoutDetails": {
        "type": "object",
        "required": [
          "partner_payout",
          "payment_tags",
          "payout_type",
          "price_breakdown",
          "property_id",
          "reservation_id",
          "total_price_of_reservation",
          "payout",
          "payout_status"
        ],
        "properties": {
          "partner_payout": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Bookings.BookingComPartnerPayout"
              }
            ],
            "description": "Summary of the payout to the property."
          },
          "payment_tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Payment programme tags applied to the reservation. Possible values: `PAYMENTS_BY_BOOKING`."
          },
          "payout_type": {
            "type": "string",
            "description": "Payout model. Possible values: `GROSS`."
          },
          "price_breakdown": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.BookingComRoomPriceBreakdown"
            },
            "description": "Commissions and charges per room reservation."
          },
          "property_id": {
            "type": "string",
            "description": "Booking.com property (hotel) identifier.",
            "examples": [
              "36364"
            ]
          },
          "reservation_id": {
            "type": "string",
            "description": "Booking.com reservation identifier.",
            "examples": [
              "5741260940"
            ]
          },
          "total_price_of_reservation": {
            "type": "object",
            "properties": {
              "total_amount_paid": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Bookings.BookingComAmount"
                  }
                ],
                "description": "Total amount already paid."
              },
              "total_amount_to_collect_at_property": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Bookings.BookingComAmount"
                  }
                ],
                "description": "Total amount to collect from the guest at the property."
              }
            },
            "required": [
              "total_amount_paid",
              "total_amount_to_collect_at_property"
            ],
            "description": "Reservation price totals."
          },
          "payout": {
            "type": "object",
            "properties": {
              "bank_transfers": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Bookings.BookingComBankTransfer"
                },
                "description": "Scheduled bank-transfer payouts."
              },
              "customer_credit_cards": {
                "type": "array",
                "items": {},
                "description": "Customer credit card payouts."
              },
              "virtual_credit_cards": {
                "type": "array",
                "items": {},
                "description": "Virtual credit card payouts."
              }
            },
            "required": [
              "bank_transfers",
              "customer_credit_cards",
              "virtual_credit_cards"
            ],
            "description": "Payouts grouped by payment method."
          },
          "payout_status": {
            "type": "string",
            "description": "Overall payout status. Possible values: `PENDING`."
          }
        },
        "description": "Payout details of a Booking.com reservation."
      },
      "Bookings.BookingComPriceBreakdown": {
        "type": "object",
        "required": [
          "partner_payout",
          "payment_tags",
          "payout_type",
          "price_breakdown",
          "property_id",
          "reservation_id",
          "total_price_of_reservation"
        ],
        "properties": {
          "partner_payout": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Bookings.BookingComPartnerPayout"
              }
            ],
            "description": "Summary of the payout to the property."
          },
          "payment_tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Payment programme tags applied to the reservation. Possible values: `PAYMENTS_BY_BOOKING`."
          },
          "payout_type": {
            "type": "string",
            "description": "Payout model. Possible values: `GROSS`."
          },
          "price_breakdown": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.BookingComRoomPriceBreakdown"
            },
            "description": "Commissions and charges per room reservation."
          },
          "property_id": {
            "type": "string",
            "description": "Booking.com property (hotel) identifier.",
            "examples": [
              "36364"
            ]
          },
          "reservation_id": {
            "type": "string",
            "description": "Booking.com reservation identifier.",
            "examples": [
              "5741260940"
            ]
          },
          "total_price_of_reservation": {
            "type": "object",
            "properties": {
              "total_amount_paid": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Bookings.BookingComAmount"
                  }
                ],
                "description": "Total amount already paid."
              },
              "total_amount_to_collect_at_property": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Bookings.BookingComAmount"
                  }
                ],
                "description": "Total amount to collect from the guest at the property."
              }
            },
            "required": [
              "total_amount_paid",
              "total_amount_to_collect_at_property"
            ],
            "description": "Reservation price totals."
          }
        },
        "description": "Price breakdown of a Booking.com reservation."
      },
      "Bookings.BookingComRoomPriceBreakdown": {
        "type": "object",
        "required": [
          "charges",
          "room_reservation_id"
        ],
        "properties": {
          "charges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.BookingComCharge"
            },
            "description": "Charges applied to the room reservation."
          },
          "room_reservation_id": {
            "type": "string",
            "description": "Booking.com room reservation identifier.",
            "examples": [
              "6438226735"
            ]
          }
        },
        "description": "Commissions and charges for one room reservation."
      },
      "Bookings.BookingCreate": {
        "type": "object",
        "required": [
          "property_id",
          "arrival_date",
          "departure_date",
          "ota_name",
          "currency",
          "customer",
          "rooms"
        ],
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the booking belongs to."
          },
          "arrival_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival date (`YYYY-MM-DD`)."
          },
          "departure_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Departure date (`YYYY-MM-DD`)."
          },
          "ota_name": {
            "type": "string",
            "description": "Name of the booking source.",
            "examples": [
              "Booking.com"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Booking currency code."
          },
          "customer": {
            "$ref": "#/components/schemas/Bookings.BookingCustomerWrite"
          },
          "rooms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.BookingRoomWrite"
            },
            "description": "Booking rooms."
          },
          "ota_reservation_code": {
            "type": "string",
            "description": "Original reservation code at the platform where the guest created the booking.",
            "examples": [
              "113"
            ]
          },
          "arrival_hour": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival time in `HH:MM` (24h) format.",
            "examples": [
              "10:00"
            ]
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingService"
            },
            "description": "Services at booking level."
          },
          "payment_collect": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentCollect"
              },
              {
                "type": "null"
              }
            ]
          },
          "payment_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentType"
              },
              {
                "type": "null"
              }
            ]
          },
          "ota_commission": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Commission amount charged by the OTA, as a decimal string. Currently available for Booking.com and Airbnb channels.",
            "examples": [
              "10.00"
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Customer notes for the booking."
          },
          "meta": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Free-form custom meta-information to exchange with integrated partners."
          },
          "deposits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.BookingDepositWrite"
            },
            "description": "Deposits associated with the booking."
          }
        },
        "description": "Booking attributes accepted when creating a booking."
      },
      "Bookings.BookingCreateRequest": {
        "type": "object",
        "required": [
          "booking"
        ],
        "properties": {
          "booking": {
            "$ref": "#/components/schemas/Bookings.BookingCreate"
          }
        },
        "description": "Request body for `POST /bookings`."
      },
      "Bookings.BookingCustomerWrite": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "surname": {
            "type": "string"
          },
          "mail": {
            "$ref": "#/components/schemas/Common.Scalars.email"
          },
          "phone": {
            "type": "string"
          },
          "country": {
            "$ref": "#/components/schemas/Common.Scalars.country"
          },
          "city": {
            "type": "string"
          },
          "address": {
            "type": "string"
          },
          "zip": {
            "type": "string"
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form custom meta-information to exchange with integrated partners."
          }
        },
        "description": "Customer of a booking being created or updated."
      },
      "Bookings.BookingDepositWrite": {
        "type": "object",
        "required": [
          "amount",
          "currency"
        ],
        "properties": {
          "amount": {
            "type": "string",
            "description": "Deposit amount as a decimal string.",
            "examples": [
              "100.00"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Deposit currency code."
          },
          "charget_at": {
            "type": "string",
            "description": "When the deposit was charged (ISO 8601, no timezone offset).",
            "examples": [
              "2019-05-05T19:20:32.001023"
            ]
          },
          "type": {
            "type": "string",
            "description": "Kind of deposit.",
            "examples": [
              "credit_card"
            ]
          },
          "notes": {
            "type": "string",
            "description": "Free-form notes about the deposit.",
            "examples": [
              "Card ending 1234"
            ]
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form deposit meta-information."
          }
        },
        "description": "A deposit associated with a booking being created or updated."
      },
      "Bookings.BookingResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "booking"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Bookings.Booking"
          }
        },
        "description": "A booking resource."
      },
      "Bookings.BookingRoomWrite": {
        "type": "object",
        "required": [
          "room_type_id",
          "rate_plan_id",
          "days",
          "occupancy"
        ],
        "properties": {
          "room_type_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Room Type to book."
          },
          "rate_plan_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Rate Plan to book."
          },
          "days": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "string"
            },
            "description": "Price breakdown per stay date: `YYYY-MM-DD` → decimal string amount."
          },
          "occupancy": {
            "$ref": "#/components/schemas/BookingRevisions.BookingOccupancy"
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingService"
            },
            "description": "Services at room level."
          },
          "taxes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingRoomTax"
            },
            "description": "Taxes of the room."
          },
          "guests": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingGuest"
            },
            "description": "Guests of the room."
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form custom meta-information to exchange with integrated partners."
          }
        },
        "description": "A room of a booking being created or updated."
      },
      "Bookings.BookingShortAttributes": {
        "type": "object",
        "required": [
          "id",
          "status",
          "booking_id",
          "unique_id",
          "revision_id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique booking identifier."
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingRevisionStatus"
              }
            ],
            "description": "Status of the booking after the operation."
          },
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique booking identifier (same as `id`)."
          },
          "unique_id": {
            "type": "string",
            "description": "Unique booking identifier combined from the OTA code and the OTA reservation code.",
            "examples": [
              "OFL-113"
            ]
          },
          "revision_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking revision produced by the operation."
          }
        },
        "description": "Attributes of an abbreviated booking resource, as returned by the create and update operations."
      },
      "Bookings.BookingShortResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "booking"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Bookings.BookingShortAttributes"
          }
        },
        "description": "An abbreviated booking resource, as returned by the create and update operations."
      },
      "Bookings.BookingUpdate": {
        "type": "object",
        "required": [
          "property_id",
          "arrival_date",
          "departure_date",
          "ota_name",
          "currency",
          "customer",
          "rooms"
        ],
        "properties": {
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.BookingRevisionStatus"
              }
            ],
            "description": "Status of the booking, matching its latest revision."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the booking belongs to."
          },
          "arrival_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival date (`YYYY-MM-DD`)."
          },
          "departure_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Departure date (`YYYY-MM-DD`)."
          },
          "ota_name": {
            "type": "string",
            "description": "Name of the booking source.",
            "examples": [
              "Booking.com"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Booking currency code."
          },
          "customer": {
            "$ref": "#/components/schemas/Bookings.BookingCustomerWrite"
          },
          "rooms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.BookingRoomWrite"
            },
            "description": "Booking rooms."
          },
          "ota_reservation_code": {
            "type": "string",
            "description": "Original reservation code at the platform where the guest created the booking.",
            "examples": [
              "113"
            ]
          },
          "arrival_hour": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival time in `HH:MM` (24h) format.",
            "examples": [
              "10:00"
            ]
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingRevisions.BookingService"
            },
            "description": "Services at booking level."
          },
          "payment_collect": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentCollect"
              },
              {
                "type": "null"
              }
            ]
          },
          "payment_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingRevisions.PaymentType"
              },
              {
                "type": "null"
              }
            ]
          },
          "ota_commission": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Commission amount charged by the OTA, as a decimal string. Currently available for Booking.com and Airbnb channels.",
            "examples": [
              "10.00"
            ]
          },
          "notes": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Customer notes for the booking."
          },
          "meta": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Free-form custom meta-information to exchange with integrated partners."
          },
          "deposits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.BookingDepositWrite"
            },
            "description": "Deposits associated with the booking."
          }
        },
        "description": "Booking attributes accepted when updating a booking. The booking is sent in full: the attributes `POST /bookings` requires are required here too. Set `status` to `cancelled` to cancel the booking."
      },
      "Bookings.BookingUpdateRequest": {
        "type": "object",
        "required": [
          "booking"
        ],
        "properties": {
          "booking": {
            "$ref": "#/components/schemas/Bookings.BookingUpdate"
          }
        },
        "description": "Request body for `PUT /bookings/{id}`."
      },
      "Bookings.GuestMisconductReport": {
        "type": "object",
        "required": [
          "category_id",
          "details_text",
          "escalate_report",
          "rebooking_allowed"
        ],
        "properties": {
          "category_id": {
            "type": "string",
            "description": "Identifier of the misconduct category.",
            "examples": [
              "1"
            ]
          },
          "subcategory_id": {
            "type": "string",
            "description": "Identifier of the misconduct subcategory within the category.",
            "examples": [
              "111"
            ]
          },
          "details_text": {
            "type": "string",
            "maxLength": 240,
            "description": "Free-form description of the misconduct. Up to 240 characters.",
            "examples": [
              "The guest damaged the room door"
            ]
          },
          "escalate_report": {
            "type": "boolean",
            "description": "Whether to escalate the report to Booking.com."
          },
          "rebooking_allowed": {
            "type": "boolean",
            "description": "Whether the guest may book the property again."
          },
          "damage_type_id": {
            "type": "integer",
            "format": "int32",
            "description": "Type of the damage. The allowed values are listed in the category's `damage_type_id` field descriptor.",
            "examples": [
              3
            ]
          },
          "damage_cost": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "string"
              }
            ],
            "description": "Cost of the damage, in the property's currency: an integer or a numeric string. Use a string for fractional amounts.",
            "examples": [
              150
            ]
          },
          "damage_unavailable": {
            "type": "boolean",
            "description": "Whether the damage prevents the property from accommodating its next reservation."
          }
        },
        "description": "A guest misconduct report. The categories, subcategories, and damage fields the channel accepts are listed by `GET /channels/{channel_id}/action/misconduct_categories`."
      },
      "Bookings.GuestMisconductRequest": {
        "type": "object",
        "required": [
          "guest_misconduct_report"
        ],
        "properties": {
          "guest_misconduct_report": {
            "$ref": "#/components/schemas/Bookings.GuestMisconductReport"
          }
        },
        "description": "Request body for `POST /bookings/{id}/guest_misconduct`."
      },
      "Bookings.MisconductAdditionalFields": {
        "type": "object",
        "required": [
          "damage_type_id",
          "damage_cost",
          "damage_unavailable"
        ],
        "properties": {
          "damage_type_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Bookings.MisconductChoiceFieldDescriptor"
              },
              {
                "type": "null"
              }
            ],
            "description": "Descriptor of the report's `damage_type_id` field."
          },
          "damage_cost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Bookings.MisconductFieldDescriptor"
              },
              {
                "type": "null"
              }
            ],
            "description": "Descriptor of the report's `damage_cost` field."
          },
          "damage_unavailable": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Bookings.MisconductChoiceFieldDescriptor"
              },
              {
                "type": "null"
              }
            ],
            "description": "Descriptor of the report's `damage_unavailable` field."
          }
        },
        "description": "Descriptors of the additional damage fields a misconduct category accepts on a guest misconduct report. A field the category does not accept is `null`."
      },
      "Bookings.MisconductCategories": {
        "type": "object",
        "required": [
          "categories"
        ],
        "properties": {
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.MisconductCategory"
            }
          }
        },
        "description": "The guest misconduct categories a channel supports."
      },
      "Bookings.MisconductCategory": {
        "type": "object",
        "required": [
          "id",
          "title",
          "additional_fields",
          "subcategories"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Category identifier — the `category_id` of a guest misconduct report. See `POST /bookings/{booking_id}/guest_misconduct`.",
            "examples": [
              "1"
            ]
          },
          "title": {
            "type": "string",
            "description": "Human-readable category title.",
            "examples": [
              "Payment issue"
            ]
          },
          "additional_fields": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Bookings.MisconductAdditionalFields"
              },
              {
                "type": "null"
              }
            ],
            "description": "Descriptors of the additional damage fields a report in this category accepts. `null` when the category accepts none."
          },
          "subcategories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.MisconductSubcategory"
            },
            "description": "The category's subcategories. Empty when it has none."
          }
        },
        "description": "A guest misconduct category."
      },
      "Bookings.MisconductChoiceFieldDescriptor": {
        "type": "object",
        "required": [
          "type",
          "description",
          "possible_values"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Value type of the field.",
            "examples": [
              "double"
            ]
          },
          "description": {
            "type": "string",
            "description": "Human-readable purpose of the field.",
            "examples": [
              "Cost of damage (in hotel currency)"
            ]
          },
          "possible_values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.MisconductFieldValue"
            },
            "description": "The values the field accepts."
          }
        },
        "description": "Describes an additional report field restricted to a fixed set of values."
      },
      "Bookings.MisconductFieldDescriptor": {
        "type": "object",
        "required": [
          "type",
          "description"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Value type of the field.",
            "examples": [
              "double"
            ]
          },
          "description": {
            "type": "string",
            "description": "Human-readable purpose of the field.",
            "examples": [
              "Cost of damage (in hotel currency)"
            ]
          }
        },
        "description": "Describes an additional report field: its value type and purpose."
      },
      "Bookings.MisconductFieldValue": {
        "type": "object",
        "required": [
          "value",
          "description"
        ],
        "properties": {
          "value": {
            "type": "integer",
            "format": "int32",
            "examples": [
              3
            ]
          },
          "description": {
            "type": "string",
            "description": "Human-readable meaning of the value.",
            "examples": [
              "Door/window/wall"
            ]
          }
        },
        "description": "One allowed value of an additional report field."
      },
      "Bookings.MisconductSubcategory": {
        "type": "object",
        "required": [
          "id",
          "title"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Subcategory identifier — the `subcategory_id` of a guest misconduct report. See `POST /bookings/{booking_id}/guest_misconduct`.",
            "examples": [
              "110"
            ]
          },
          "title": {
            "type": "string",
            "description": "Human-readable subcategory title.",
            "examples": [
              "Didn't pay reservation amount"
            ]
          }
        },
        "description": "A subcategory of a guest misconduct category."
      },
      "Bookings.NoShowReportRequest": {
        "type": "object",
        "required": [
          "no_show_report"
        ],
        "properties": {
          "no_show_report": {
            "type": "object",
            "properties": {
              "waived_fees": {
                "type": "boolean",
                "description": "Whether the property waives the no-show fees."
              },
              "penalty_amount": {
                "type": "string",
                "description": "Penalty amount as a decimal string. Applicable to Expedia bookings only.",
                "examples": [
                  "10.00"
                ]
              }
            },
            "required": [
              "waived_fees"
            ]
          }
        },
        "description": "Request body for `POST /bookings/{id}/no_show`."
      },
      "Bookings.StayChangeReport": {
        "type": "object",
        "required": [
          "booking_room_id"
        ],
        "properties": {
          "booking_room_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "The `booking_room_id` of the room the report applies to. Reports referencing a room that does not belong to the booking are ignored; when no report matches, the request fails with a validation error."
          },
          "checkout_date": {
            "type": "string",
            "format": "date",
            "description": "The room's new checkout date. The check-in date cannot be changed."
          },
          "amount": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "string"
              }
            ],
            "description": "The room's new price, in the booking's currency: an integer is an amount in minor currency units (cents); a decimal string is an amount in major units.",
            "examples": [
              10000
            ]
          }
        },
        "description": "A stay change report for one room of a booking. At least one of `checkout_date` and `amount` must be provided; an omitted field keeps the room's current value."
      },
      "Bookings.StayChangeRequest": {
        "type": "object",
        "required": [
          "stay_change_reports"
        ],
        "properties": {
          "stay_change_reports": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bookings.StayChangeReport"
            },
            "minItems": 1,
            "description": "Stay change reports, one per booking room."
          }
        },
        "description": "Request body for `POST /bookings/{id}/stay_change`."
      },
      "ChannelAvailabilityRules.AvailabilityRuleType": {
        "type": "string",
        "enum": [
          "close_out",
          "availability_offset",
          "max_availability"
        ],
        "description": "Kind of availability override the rule applies."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRule": {
        "type": "object",
        "required": [
          "id",
          "type",
          "start_date",
          "affected_channels",
          "affected_room_types",
          "title",
          "days",
          "end_date",
          "value"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique rule identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "98a6b45d-49aa-4080-8bfc-9ec94fe24d81"
            ]
          },
          "type": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.AvailabilityRuleType"
          },
          "start_date": {
            "type": "string",
            "format": "date",
            "description": "First date the rule applies.",
            "examples": [
              "2026-10-01"
            ]
          },
          "affected_channels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Channels the rule affects. At least one, and each must be a channel of the property."
          },
          "affected_room_types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Room types the rule affects. At least one, and each must be a room type of the property."
          },
          "title": {
            "type": "string",
            "description": "Rule title. Defaults to the name of the rule's `type` when omitted.",
            "examples": [
              "Close out"
            ]
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChannelAvailabilityRules.DayOfWeek"
            },
            "description": "Days of week the rule applies to. A rule that applies every day carries all seven;\nan empty list means the rule applies on no day and changes nothing. Names outside\nthe seven are ignored."
          },
          "end_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last date the rule applies, or null to apply to every date from `start_date` on. Must be later than `start_date`."
          },
          "value": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Adjustment value: subtracted from availability for `availability_offset` and the\nceiling for `max_availability`, where it is required. Null for `close_out`."
          }
        },
        "description": "An availability rule as returned in responses: every attribute is present."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleCreate": {
        "type": "object",
        "required": [
          "type",
          "start_date",
          "affected_channels",
          "affected_room_types",
          "property_id"
        ],
        "properties": {
          "type": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.AvailabilityRuleType"
          },
          "start_date": {
            "type": "string",
            "format": "date",
            "description": "First date the rule applies.",
            "examples": [
              "2026-10-01"
            ]
          },
          "affected_channels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Channels the rule affects. At least one, and each must be a channel of the property."
          },
          "affected_room_types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Room types the rule affects. At least one, and each must be a room type of the property."
          },
          "title": {
            "type": "string",
            "description": "Rule title. Defaults to the name of the rule's `type` when omitted.",
            "examples": [
              "Close out"
            ]
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChannelAvailabilityRules.DayOfWeek"
            },
            "description": "Days of week the rule applies to. A rule that applies every day carries all seven;\nan empty list means the rule applies on no day and changes nothing. Names outside\nthe seven are ignored."
          },
          "end_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last date the rule applies, or null to apply to every date from `start_date` on. Must be later than `start_date`."
          },
          "value": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Adjustment value: subtracted from availability for `availability_offset` and the\nceiling for `max_availability`, where it is required. Null for `close_out`."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the rule belongs to."
          }
        },
        "description": "Attributes accepted when creating an availability rule."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleCreateRequest": {
        "type": "object",
        "required": [
          "channel_availability_rule"
        ],
        "properties": {
          "channel_availability_rule": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleCreate"
          }
        },
        "description": "Request body accepted when creating an availability rule."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleOption": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "channel_availability_rule"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleOptionAttributes"
          }
        },
        "description": "A lightweight availability rule for selectors: the read attributes except `value`, and no relationships."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleOptionAttributes": {
        "type": "object",
        "required": [
          "id",
          "type",
          "start_date",
          "affected_channels",
          "affected_room_types",
          "title",
          "days",
          "end_date"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique rule identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "98a6b45d-49aa-4080-8bfc-9ec94fe24d81"
            ]
          },
          "type": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.AvailabilityRuleType"
          },
          "start_date": {
            "type": "string",
            "format": "date",
            "description": "First date the rule applies.",
            "examples": [
              "2026-10-01"
            ]
          },
          "affected_channels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Channels the rule affects. At least one, and each must be a channel of the property."
          },
          "affected_room_types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Room types the rule affects. At least one, and each must be a room type of the property."
          },
          "title": {
            "type": "string",
            "description": "Rule title. Defaults to the name of the rule's `type` when omitted.",
            "examples": [
              "Close out"
            ]
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChannelAvailabilityRules.DayOfWeek"
            },
            "description": "Days of week the rule applies to. A rule that applies every day carries all seven;\nan empty list means the rule applies on no day and changes nothing. Names outside\nthe seven are ignored."
          },
          "end_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last date the rule applies, or null to apply to every date from `start_date` on. Must be later than `start_date`."
          }
        },
        "description": "Attributes of an availability rule `/options` item: the read attributes except `value`."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleRelationships": {
        "type": "object",
        "required": [
          "property"
        ],
        "properties": {
          "property": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/ChannelAvailabilityRules.EmbeddedRuleProperty"
              }
            },
            "required": [
              "data"
            ],
            "description": "The property the rule belongs to."
          }
        },
        "description": "Relationships of an availability rule: the property it belongs to."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "channel_availability_rule"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRule"
          },
          "relationships": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleRelationships"
          }
        },
        "description": "An availability rule resource: the rule attributes plus the property it belongs to."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleUpdate": {
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.AvailabilityRuleType"
          },
          "start_date": {
            "type": "string",
            "format": "date",
            "description": "First date the rule applies.",
            "examples": [
              "2026-10-01"
            ]
          },
          "affected_channels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Channels the rule affects. At least one, and each must be a channel of the property."
          },
          "affected_room_types": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Room types the rule affects. At least one, and each must be a room type of the property."
          },
          "title": {
            "type": "string",
            "description": "Rule title. Defaults to the name of the rule's `type` when omitted.",
            "examples": [
              "Close out"
            ]
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChannelAvailabilityRules.DayOfWeek"
            },
            "description": "Days of week the rule applies to. A rule that applies every day carries all seven;\nan empty list means the rule applies on no day and changes nothing. Names outside\nthe seven are ignored."
          },
          "end_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Last date the rule applies, or null to apply to every date from `start_date` on. Must be later than `start_date`."
          },
          "value": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Adjustment value: subtracted from availability for `availability_offset` and the\nceiling for `max_availability`, where it is required. Null for `close_out`."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the rule belongs to."
          }
        },
        "description": "Attributes accepted when updating an availability rule. Every attribute is optional; attributes absent from the request are left unchanged."
      },
      "ChannelAvailabilityRules.ChannelAvailabilityRuleUpdateRequest": {
        "type": "object",
        "required": [
          "channel_availability_rule"
        ],
        "properties": {
          "channel_availability_rule": {
            "$ref": "#/components/schemas/ChannelAvailabilityRules.ChannelAvailabilityRuleUpdate"
          }
        },
        "description": "Request body accepted when updating an availability rule."
      },
      "ChannelAvailabilityRules.DayOfWeek": {
        "type": "string",
        "enum": [
          "mo",
          "tu",
          "we",
          "th",
          "fr",
          "sa",
          "su"
        ],
        "description": "Day of week a rule can be restricted to."
      },
      "ChannelAvailabilityRules.EmbeddedRuleProperty": {
        "type": "object",
        "required": [
          "id",
          "type"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "property"
            ]
          }
        },
        "description": "The property an availability rule belongs to."
      },
      "Channels.OtaFault": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Channels.OtaFaultObject"
          }
        },
        "description": "The OTA rejected the request; `errors` relays the OTA's fault."
      },
      "Channels.OtaFaultObject": {
        "type": "object",
        "required": [
          "fault_code",
          "message"
        ],
        "properties": {
          "fault_code": {
            "type": "integer",
            "format": "int32",
            "description": "Numeric fault code assigned by the OTA.",
            "examples": [
              404
            ]
          },
          "message": {
            "type": "string",
            "description": "Human-readable fault message from the OTA."
          }
        },
        "description": "Error object relaying a fault reported by the channel's OTA."
      },
      "ChannexIO.Common.Scalars.positiveInt": {
        "type": "integer",
        "format": "int32",
        "minimum": 1
      },
      "ChannexIO.RatePlans.DerivedOptionRule": {
        "type": "string",
        "enum": [
          "increase_by_amount",
          "increase_by_percent",
          "decrease_by_amount",
          "decrease_by_percent"
        ],
        "description": "A value-modification rule, applied to the original value with the step's argument.\n`increase_by_amount` — add the amount.\n`increase_by_percent` — increase by the percent.\n`decrease_by_amount` — subtract the amount.\n`decrease_by_percent` — decrease by the percent."
      },
      "ChannexIO.RatePlans.DerivedOptionSetRule": {
        "type": "string",
        "enum": [
          "set"
        ],
        "description": "The rule of `min_stay_arrival`, `min_stay_through` and `stop_sell`: `set` — the restriction takes the rule's value."
      },
      "Common.Errors.BadRequest": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "bad_request"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Bad Request"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "The request cannot be processed in the current state."
      },
      "Common.Errors.BadRequestReasonObject": {
        "type": "object",
        "required": [
          "code",
          "title",
          "details"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "bad_request"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Bad Request"
            ]
          },
          "details": {
            "type": "string",
            "description": "Human-readable reason the request could not be processed.",
            "examples": [
              "User already invited"
            ]
          }
        },
        "description": "Error object for a bad request, adding a single human-readable reason."
      },
      "Common.Errors.BadRequestReasonsObject": {
        "type": "object",
        "required": [
          "code",
          "title",
          "details"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "bad_request"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Bad Request"
            ]
          },
          "details": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Human-readable reasons the request could not be processed.",
            "examples": [
              [
                "restrictions is required"
              ]
            ]
          }
        },
        "description": "Error object for a bad request, adding a list of human-readable reasons."
      },
      "Common.Errors.BadRequestWithReason": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Common.Errors.BadRequestReasonObject"
          }
        },
        "description": "The request could not be processed in the current state; `details` explains why."
      },
      "Common.Errors.BadRequestWithReasons": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Common.Errors.BadRequestReasonsObject"
          }
        },
        "description": "The request has missing or invalid arguments; `details` lists the reasons."
      },
      "Common.Errors.Forbidden": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "forbidden"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Forbidden"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "The authenticated user lacks permission to perform this action."
      },
      "Common.Errors.InvalidArguments": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Common.Errors.InvalidArgumentsObject"
          }
        },
        "description": "The request has missing or invalid arguments; `details` lists the messages per argument."
      },
      "Common.Errors.InvalidArgumentsObject": {
        "type": "object",
        "required": [
          "code",
          "title",
          "details"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "bad_request"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Bad Request"
            ]
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Maps each invalid argument to the list of validation messages for that argument.",
            "examples": [
              {
                "id": [
                  "can't be blank"
                ]
              }
            ]
          }
        },
        "description": "Error object for invalid request arguments, adding per-argument messages."
      },
      "Common.Errors.InvalidNestedArguments": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Common.Errors.InvalidNestedArgumentsObject"
          }
        },
        "description": "The request has invalid arguments; `details` lists the messages per argument, one level deeper for an argument that is itself a group."
      },
      "Common.Errors.InvalidNestedArgumentsObject": {
        "type": "object",
        "required": [
          "code",
          "title",
          "details"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "bad_request"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Bad Request"
            ]
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {
              "anyOf": [
                {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                {
                  "type": "object",
                  "unevaluatedProperties": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              ]
            },
            "description": "Maps each invalid argument to its validation messages: a list of messages for a flat argument, and the messages per argument inside the group for a nested one.",
            "examples": [
              {
                "filter": [
                  "date must be specified"
                ],
                "pagination": {
                  "limit": [
                    "must be less than or equal to 100"
                  ]
                }
              }
            ]
          }
        },
        "description": "Error object for invalid request arguments, adding per-argument messages and, for an argument that is a group, the messages inside it."
      },
      "Common.Errors.MethodNotSupported": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "method_not_supported"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Method Not Supported"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "The operation is not supported for this resource — e.g. the booking's OTA does not support the Reporting API."
      },
      "Common.Errors.NotFound": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "resource_not_found"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Resource Not Found"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "The requested resource does not exist."
      },
      "Common.Errors.NotSupported": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "not_supported"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Method not supported"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "The operation is not supported for this resource — e.g. the booking's OTA does not support the Messages API."
      },
      "Common.Errors.ServiceUnavailable": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "service_unavailable"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Service Temporary Unavailable"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "A backing service is temporarily unavailable; retry the request later."
      },
      "Common.Errors.TooManyRequests": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "http_too_many_requests"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Too Many Requests"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "The client has sent too many requests and is being rate limited."
      },
      "Common.Errors.Unauthorized": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "type": "object",
            "required": [
              "code",
              "title"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "unauthorized"
                ]
              },
              "title": {
                "type": "string",
                "enum": [
                  "Unauthorized"
                ]
              }
            },
            "description": "Shape of a single JSON:API error object: a stable machine code plus a human-readable title."
          }
        },
        "description": "Authentication credentials are missing or invalid."
      },
      "Common.Errors.UnparsableRequest": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Common.Errors.UnparsableRequestObject"
          }
        },
        "description": "The request body could not be parsed as JSON."
      },
      "Common.Errors.UnparsableRequestObject": {
        "type": "object",
        "required": [
          "code",
          "title",
          "details"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "bad_request"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Bad Request"
            ]
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "string"
            },
            "description": "Maps the part of the request that could not be parsed to the reason.",
            "examples": [
              {
                "body": "malformed JSON"
              }
            ]
          }
        },
        "description": "Error object for an unparsable request body, naming the malformed part."
      },
      "Common.Errors.UnprocessableEntity": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Common.Errors.UnprocessableEntityObject"
          }
        },
        "description": "The request was understood but could not be carried out; `details`, where present, names the reason per argument."
      },
      "Common.Errors.UnprocessableEntityObject": {
        "type": "object",
        "required": [
          "code",
          "title"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "unprocessable_entity"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Unprocessable Entity"
            ]
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "string"
            },
            "description": "Maps each rejected argument to the reason it was rejected.",
            "examples": [
              {
                "thread_id": "Thread id is not available"
              }
            ]
          }
        },
        "description": "Error object for a rejected request, adding the reason per argument."
      },
      "Common.Errors.ValidationError": {
        "type": "object",
        "required": [
          "errors"
        ],
        "properties": {
          "errors": {
            "$ref": "#/components/schemas/Common.Errors.ValidationErrorObject"
          }
        },
        "description": "The request body failed validation."
      },
      "Common.Errors.ValidationErrorObject": {
        "type": "object",
        "required": [
          "code",
          "title",
          "details"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "validation_error"
            ]
          },
          "title": {
            "type": "string",
            "enum": [
              "Validation Error"
            ]
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Maps each invalid field to the list of validation messages for that field.",
            "examples": [
              {
                "field_name": [
                  "can't be blank"
                ]
              }
            ]
          }
        },
        "description": "Error object for a failed validation, adding per-field messages."
      },
      "Common.JsonApi.OptionAttributes": {
        "type": "object",
        "required": [
          "id",
          "title"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "title": {
            "type": "string",
            "examples": [
              "My Hotel"
            ]
          }
        },
        "description": "Attributes of a lightweight `/options` item: identifier and display title."
      },
      "Common.JsonApi.SuccessMessage": {
        "type": "object",
        "required": [
          "meta"
        ],
        "properties": {
          "meta": {
            "type": "object",
            "properties": {
              "message": {
                "type": "string",
                "examples": [
                  "Success"
                ]
              }
            },
            "required": [
              "message"
            ]
          }
        },
        "description": "Success response carrying only a meta message (no resource body)."
      },
      "Common.Pagination.OrderDirection": {
        "type": "string",
        "enum": [
          "asc",
          "desc"
        ],
        "description": "Sort direction for list results."
      },
      "Common.Pagination.PaginationMeta": {
        "type": "object",
        "required": [
          "page",
          "limit",
          "total",
          "order_by",
          "order_direction"
        ],
        "properties": {
          "page": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Page returned, counted from 1.",
            "examples": [
              1
            ]
          },
          "limit": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "maximum": 100,
            "description": "Number of items per page. At most 100 — requests with `pagination[limit]` above 100 are rejected with `422 Unprocessable Entity`.",
            "examples": [
              10
            ]
          },
          "total": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "examples": [
              1
            ]
          },
          "order_by": {
            "type": "string",
            "description": "Field the results are ordered by.",
            "examples": [
              "inserted_at"
            ]
          },
          "order_direction": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Pagination.OrderDirection"
              }
            ],
            "description": "Direction the results are ordered in.",
            "examples": [
              "desc"
            ]
          }
        },
        "description": "Pagination and ordering metadata attached to list responses."
      },
      "Common.Scalars.country": {
        "type": "string",
        "minLength": 2,
        "maxLength": 2,
        "description": "ISO 3166-1 alpha-2 country code.",
        "examples": [
          "GB"
        ]
      },
      "Common.Scalars.currency": {
        "type": "string",
        "minLength": 3,
        "maxLength": 3,
        "description": "ISO 4217 alphabetic currency code. See the `/currencies` endpoint for supported values.",
        "examples": [
          "USD"
        ]
      },
      "Common.Scalars.decimalString": {
        "type": "string",
        "description": "A decimal number as a string, e.g. `100.00`. Every monetary amount the API returns takes this form.",
        "examples": [
          "100.00"
        ]
      },
      "Common.Scalars.email": {
        "type": "string",
        "format": "email"
      },
      "Common.Scalars.id": {
        "type": "string",
        "format": "uuid",
        "examples": [
          "716305c4-561a-4561-a187-7f5b8aeb5920"
        ]
      },
      "Common.Scalars.nonNegativeInt": {
        "type": "integer",
        "format": "int32",
        "minimum": 0
      },
      "Common.Scalars.positiveInt": {
        "type": "integer",
        "format": "int32",
        "minimum": 1
      },
      "Common.Scalars.timezone": {
        "type": "string",
        "description": "Time zone name from the IANA Time Zone Database (the \"tz database\"), published at\nhttps://www.iana.org/time-zones — background at\nhttps://en.wikipedia.org/wiki/Tz_database. See the `/timezones` endpoint for the\nvalues this API accepts.",
        "examples": [
          "Europe/London"
        ]
      },
      "Facilities.Facility": {
        "type": "object",
        "required": [
          "id",
          "category",
          "title"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique facility identifier. Mirrors the resource `id`.",
            "examples": [
              "864d91a6-3a40-4098-a880-84b841e11adb"
            ]
          },
          "category": {
            "type": "string",
            "description": "Grouping code the facility belongs to, in lower snake case. The property and\nroom type dictionaries have separate vocabularies: a code valid for one is\nrejected by the other. `filter[category]` takes this value.",
            "examples": [
              "general"
            ]
          },
          "title": {
            "type": "string",
            "description": "Human-readable facility name.",
            "examples": [
              "24-hour front desk"
            ]
          }
        },
        "description": "Attributes of a facility (amenity) available at a property or room type."
      },
      "Facilities.FacilityResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "facility"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Facilities.Facility"
          }
        },
        "description": "A facility resource object (JSON:API), returned by both list and options endpoints."
      },
      "GroupUsers.EmbeddedGroup": {
        "type": "object",
        "required": [
          "id",
          "type"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "group"
            ]
          }
        },
        "description": "The group a membership belongs to, as it appears among a group user's relationships."
      },
      "GroupUsers.GroupUser": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "group_id",
          "role",
          "overrides"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique group user identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "776533f2-c10e-49d8-bddc-14b3e27c2a00"
            ]
          },
          "user_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the user the membership grants access to.",
            "examples": [
              "c9cfa184-5095-4ef2-bbe2-e723ffb49184"
            ]
          },
          "group_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the group the membership belongs to.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/GroupUsers.GroupUserRole"
          },
          "overrides": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Access policy overrides applied to this membership on top of the role, or null when the role applies unchanged."
          }
        },
        "description": "A user's membership of a group, as returned in responses: every attribute is present."
      },
      "GroupUsers.GroupUserCreate": {
        "type": "object",
        "required": [
          "group_id",
          "user_email",
          "role"
        ],
        "properties": {
          "group_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the group to invite the user into.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "user_email": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              }
            ],
            "description": "Email address of the user to invite. A user without a Channex account gets one,\nand an onboarding email.",
            "examples": [
              "other_user@channex.io"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/GroupUsers.GroupUserRole"
          },
          "overrides": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Access policy overrides applied to this membership on top of the role, or null when the role applies unchanged."
          }
        },
        "description": "Attributes accepted when inviting a user into a group."
      },
      "GroupUsers.GroupUserCreateRequest": {
        "type": "object",
        "required": [
          "invite"
        ],
        "properties": {
          "invite": {
            "$ref": "#/components/schemas/GroupUsers.GroupUserCreate"
          }
        },
        "description": "Request body accepted when inviting a user into a group."
      },
      "GroupUsers.GroupUserRelationships": {
        "type": "object",
        "required": [
          "group",
          "user"
        ],
        "properties": {
          "group": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/GroupUsers.EmbeddedGroup"
              }
            },
            "required": [
              "data"
            ],
            "description": "The group the membership belongs to."
          },
          "user": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/Authentication.EmbeddedUser"
              }
            },
            "required": [
              "data"
            ],
            "description": "The user the membership grants access to."
          }
        },
        "description": "Relationships of a group user resource: the group the membership is in and the user it grants access to."
      },
      "GroupUsers.GroupUserResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "group_user"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/GroupUsers.GroupUser"
          },
          "relationships": {
            "$ref": "#/components/schemas/GroupUsers.GroupUserRelationships"
          }
        },
        "description": "A group user resource: the membership attributes plus the group and user it links."
      },
      "GroupUsers.GroupUserRole": {
        "type": "string",
        "enum": [
          "owner",
          "user"
        ],
        "description": "Role granted to a user within a group."
      },
      "GroupUsers.GroupUserUpdate": {
        "type": "object",
        "properties": {
          "role": {
            "$ref": "#/components/schemas/GroupUsers.GroupUserRole"
          },
          "overrides": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Access policy overrides applied to this membership on top of the role, or null when the role applies unchanged."
          }
        },
        "description": "Attributes accepted when updating a group user. Both are optional; an attribute absent from the request is left unchanged."
      },
      "GroupUsers.GroupUserUpdateRequest": {
        "type": "object",
        "required": [
          "group_user"
        ],
        "properties": {
          "group_user": {
            "$ref": "#/components/schemas/GroupUsers.GroupUserUpdate"
          }
        },
        "description": "Request body accepted when updating a group user."
      },
      "Groups.EmbeddedProperty": {
        "type": "object",
        "required": [
          "id",
          "type",
          "attributes"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "property"
            ]
          },
          "attributes": {
            "type": "object",
            "properties": {
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "title": {
                "type": "string",
                "examples": [
                  "Property 1"
                ]
              }
            },
            "required": [
              "id",
              "title"
            ]
          }
        },
        "description": "A property as it appears among a group's relationships."
      },
      "Groups.Group": {
        "type": "object",
        "required": [
          "id",
          "title"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique group identifier.",
            "examples": [
              "f71f6a62-d49a-4f2f-ae90-4f81d347ff67"
            ]
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Group title.",
            "examples": [
              "User Group"
            ]
          }
        },
        "description": "A group — a set of properties and the users who may reach them — as returned in responses."
      },
      "Groups.GroupCreate": {
        "type": "object",
        "required": [
          "title"
        ],
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Group title.",
            "examples": [
              "User Group"
            ]
          }
        },
        "description": "Group attributes accepted when creating a group."
      },
      "Groups.GroupCreateRequest": {
        "type": "object",
        "required": [
          "group"
        ],
        "properties": {
          "group": {
            "$ref": "#/components/schemas/Groups.GroupCreate"
          }
        },
        "description": "Request body accepted when creating a group."
      },
      "Groups.GroupRelationships": {
        "type": "object",
        "required": [
          "properties",
          "users"
        ],
        "properties": {
          "properties": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Groups.EmbeddedProperty"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Properties in the group."
          },
          "users": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Authentication.EmbeddedUser"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Users with access to the group."
          }
        },
        "description": "Relationships of a group resource: the properties it holds and the users who may reach them."
      },
      "Groups.GroupResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "group"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Groups.Group"
          },
          "relationships": {
            "$ref": "#/components/schemas/Groups.GroupRelationships"
          }
        },
        "description": "A group as returned in responses."
      },
      "Groups.GroupUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Group title.",
            "examples": [
              "User Group"
            ]
          }
        },
        "description": "Group attributes accepted when updating a group. Every attribute is optional; attributes absent from the request are left unchanged."
      },
      "Groups.GroupUpdateRequest": {
        "type": "object",
        "required": [
          "group"
        ],
        "properties": {
          "group": {
            "$ref": "#/components/schemas/Groups.GroupUpdate"
          }
        },
        "description": "Request body accepted when updating a group."
      },
      "HotelPolicies.EmbeddedHotelPolicy": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "hotel_policy"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/HotelPolicies.EmbeddedHotelPolicyAttributes"
          }
        },
        "description": "A hotel policy embedded in another resource's relationships."
      },
      "HotelPolicies.EmbeddedHotelPolicyAttributes": {
        "type": "object",
        "required": [
          "id",
          "title",
          "pets_policy",
          "smoking_policy",
          "checkin_from_time",
          "checkin_to_time",
          "checkout_from_time",
          "checkout_to_time"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique hotel policy identifier.",
            "examples": [
              "cfe101bf-126c-4031-8d73-27739929329a"
            ]
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Hotel policy title.",
            "examples": [
              "Hotel Policy"
            ]
          },
          "pets_policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.PetsPolicy"
              }
            ],
            "description": "Policy towards pets. `not_allowed` clears `pets_non_refundable_fee` and `pets_refundable_deposit`."
          },
          "smoking_policy": {
            "$ref": "#/components/schemas/HotelPolicies.SmokingPolicy"
          },
          "checkin_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-in time.",
            "examples": [
              "14:00"
            ]
          },
          "checkin_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-in time.",
            "examples": [
              "23:30"
            ]
          },
          "checkout_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-out time.",
            "examples": [
              "11:00"
            ]
          },
          "checkout_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-out time.",
            "examples": [
              "12:00"
            ]
          }
        },
        "description": "Attributes of a hotel policy embedded in another resource's relationships."
      },
      "HotelPolicies.HotelPolicy": {
        "type": "object",
        "required": [
          "id",
          "title",
          "currency",
          "max_count_of_guests",
          "internet_access_type",
          "parking_type",
          "parking_reservation",
          "pets_policy",
          "smoking_policy",
          "checkin_from_time",
          "checkin_to_time",
          "checkout_from_time",
          "checkout_to_time",
          "internet_access_coverage",
          "internet_access_cost",
          "parking_is_private",
          "parking_cost",
          "pets_non_refundable_fee",
          "pets_refundable_deposit",
          "is_adults_only",
          "self_checkin_checkout",
          "infant_max_age",
          "children_max_age",
          "enhanced_cleaning_practices",
          "cleaning_practices_description",
          "partner_hygiene_link"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique hotel policy identifier.",
            "examples": [
              "cfe101bf-126c-4031-8d73-27739929329a"
            ]
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Hotel policy title.",
            "examples": [
              "Hotel Policy"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Policy currency (ISO 4217)."
          },
          "max_count_of_guests": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Maximum number of guests that can stay at the property at the same time. Greater than zero."
          },
          "internet_access_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.InternetAccessType"
              }
            ],
            "description": "Type of internet access available at the property. `none` clears `internet_access_coverage` and `internet_access_cost`; `wifi` and `wired` require `internet_access_coverage`."
          },
          "parking_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.ParkingType"
              }
            ],
            "description": "Type of parking available at the property. `none` sets `parking_reservation` to `not_available`."
          },
          "parking_reservation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.ParkingReservation"
              }
            ],
            "description": "Whether parking must be reserved in advance. Stored as `not_available` when `parking_type` is `none`, whatever value is sent."
          },
          "pets_policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.PetsPolicy"
              }
            ],
            "description": "Policy towards pets. `not_allowed` clears `pets_non_refundable_fee` and `pets_refundable_deposit`."
          },
          "smoking_policy": {
            "$ref": "#/components/schemas/HotelPolicies.SmokingPolicy"
          },
          "checkin_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-in time.",
            "examples": [
              "14:00"
            ]
          },
          "checkin_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-in time.",
            "examples": [
              "23:30"
            ]
          },
          "checkout_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-out time.",
            "examples": [
              "11:00"
            ]
          },
          "checkout_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-out time.",
            "examples": [
              "12:00"
            ]
          },
          "internet_access_coverage": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.InternetAccessCoverage"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where internet access is available. Required when `internet_access_type` is `wifi` or `wired`; `null` when it is `none`."
          },
          "internet_access_cost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cost of internet access as a decimal string, zero or greater, or `null` when access is free. Cleared when `internet_access_type` is `none`."
          },
          "parking_is_private": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the parking is private, or null when not set."
          },
          "parking_cost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cost of parking as a decimal string, zero or greater, or `null` when parking is free. Kept when `parking_type` is `none`."
          },
          "pets_non_refundable_fee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Non-refundable fee for pets accommodation as a decimal string, or `null` when not charged. Cleared when `pets_policy` is `not_allowed`."
          },
          "pets_refundable_deposit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Refundable deposit for pets accommodation as a decimal string, or `null` when not charged. Cleared when `pets_policy` is `not_allowed`."
          },
          "is_adults_only": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the property accepts adults only — `true` when children are not accommodated — or null when not set."
          },
          "self_checkin_checkout": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether self check-in/check-out is available, or null when not set."
          },
          "infant_max_age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "maximum": 10,
            "description": "Maximum age at which a guest counts as an infant, at most 10, or null when not set."
          },
          "children_max_age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "maximum": 21,
            "description": "Maximum age at which a guest counts as a child, at most 21, or null when not set."
          },
          "enhanced_cleaning_practices": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the property follows enhanced cleaning practices, or null when not set."
          },
          "cleaning_practices_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Description of the property's cleaning practices, or null when not set."
          },
          "partner_hygiene_link": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Link to the partner's hygiene guidelines, or null when not set. Must be an absolute URL carrying a scheme and a host.",
            "examples": [
              "https://example.com/hygiene"
            ]
          }
        },
        "description": "A hotel policy as returned in responses: every attribute is present."
      },
      "HotelPolicies.HotelPolicyCreate": {
        "type": "object",
        "required": [
          "title",
          "currency",
          "max_count_of_guests",
          "internet_access_type",
          "parking_type",
          "parking_reservation",
          "pets_policy",
          "smoking_policy",
          "checkin_from_time",
          "checkin_to_time",
          "checkout_from_time",
          "checkout_to_time",
          "property_id"
        ],
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Hotel policy title.",
            "examples": [
              "Hotel Policy"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Policy currency (ISO 4217)."
          },
          "max_count_of_guests": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Maximum number of guests that can stay at the property at the same time. Greater than zero."
          },
          "internet_access_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.InternetAccessType"
              }
            ],
            "description": "Type of internet access available at the property. `none` clears `internet_access_coverage` and `internet_access_cost`; `wifi` and `wired` require `internet_access_coverage`."
          },
          "parking_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.ParkingType"
              }
            ],
            "description": "Type of parking available at the property. `none` sets `parking_reservation` to `not_available`."
          },
          "parking_reservation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.ParkingReservation"
              }
            ],
            "description": "Whether parking must be reserved in advance. Stored as `not_available` when `parking_type` is `none`, whatever value is sent."
          },
          "pets_policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.PetsPolicy"
              }
            ],
            "description": "Policy towards pets. `not_allowed` clears `pets_non_refundable_fee` and `pets_refundable_deposit`."
          },
          "smoking_policy": {
            "$ref": "#/components/schemas/HotelPolicies.SmokingPolicy"
          },
          "checkin_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-in time.",
            "examples": [
              "14:00"
            ]
          },
          "checkin_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-in time.",
            "examples": [
              "23:30"
            ]
          },
          "checkout_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-out time.",
            "examples": [
              "11:00"
            ]
          },
          "checkout_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-out time.",
            "examples": [
              "12:00"
            ]
          },
          "internet_access_coverage": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.InternetAccessCoverage"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where internet access is available. Required when `internet_access_type` is `wifi` or `wired`; `null` when it is `none`."
          },
          "internet_access_cost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cost of internet access as a decimal string, zero or greater, or `null` when access is free. Cleared when `internet_access_type` is `none`."
          },
          "parking_is_private": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the parking is private, or null when not set."
          },
          "parking_cost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cost of parking as a decimal string, zero or greater, or `null` when parking is free. Kept when `parking_type` is `none`."
          },
          "pets_non_refundable_fee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Non-refundable fee for pets accommodation as a decimal string, or `null` when not charged. Cleared when `pets_policy` is `not_allowed`."
          },
          "pets_refundable_deposit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Refundable deposit for pets accommodation as a decimal string, or `null` when not charged. Cleared when `pets_policy` is `not_allowed`."
          },
          "is_adults_only": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the property accepts adults only — `true` when children are not accommodated — or null when not set."
          },
          "self_checkin_checkout": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether self check-in/check-out is available, or null when not set."
          },
          "infant_max_age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "maximum": 10,
            "description": "Maximum age at which a guest counts as an infant, at most 10, or null when not set."
          },
          "children_max_age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "maximum": 21,
            "description": "Maximum age at which a guest counts as a child, at most 21, or null when not set."
          },
          "enhanced_cleaning_practices": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the property follows enhanced cleaning practices, or null when not set."
          },
          "cleaning_practices_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Description of the property's cleaning practices, or null when not set."
          },
          "partner_hygiene_link": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Link to the partner's hygiene guidelines, or null when not set. Must be an absolute URL carrying a scheme and a host.",
            "examples": [
              "https://example.com/hygiene"
            ]
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the policy belongs to. Cannot be changed after the policy is created: a different value is refused, the same value is accepted."
          }
        },
        "description": "Hotel policy attributes accepted when creating a hotel policy."
      },
      "HotelPolicies.HotelPolicyCreateRequest": {
        "type": "object",
        "required": [
          "hotel_policy"
        ],
        "properties": {
          "hotel_policy": {
            "$ref": "#/components/schemas/HotelPolicies.HotelPolicyCreate"
          }
        },
        "description": "Request body accepted when creating a hotel policy."
      },
      "HotelPolicies.HotelPolicyResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "hotel_policy"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/HotelPolicies.HotelPolicy"
          }
        },
        "description": "A hotel policy resource. Carries attributes only — no relationships block."
      },
      "HotelPolicies.HotelPolicyUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Hotel policy title.",
            "examples": [
              "Hotel Policy"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Policy currency (ISO 4217)."
          },
          "max_count_of_guests": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Maximum number of guests that can stay at the property at the same time. Greater than zero."
          },
          "internet_access_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.InternetAccessType"
              }
            ],
            "description": "Type of internet access available at the property. `none` clears `internet_access_coverage` and `internet_access_cost`; `wifi` and `wired` require `internet_access_coverage`."
          },
          "parking_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.ParkingType"
              }
            ],
            "description": "Type of parking available at the property. `none` sets `parking_reservation` to `not_available`."
          },
          "parking_reservation": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.ParkingReservation"
              }
            ],
            "description": "Whether parking must be reserved in advance. Stored as `not_available` when `parking_type` is `none`, whatever value is sent."
          },
          "pets_policy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.PetsPolicy"
              }
            ],
            "description": "Policy towards pets. `not_allowed` clears `pets_non_refundable_fee` and `pets_refundable_deposit`."
          },
          "smoking_policy": {
            "$ref": "#/components/schemas/HotelPolicies.SmokingPolicy"
          },
          "checkin_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-in time.",
            "examples": [
              "14:00"
            ]
          },
          "checkin_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-in time.",
            "examples": [
              "23:30"
            ]
          },
          "checkout_from_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Earliest check-out time.",
            "examples": [
              "11:00"
            ]
          },
          "checkout_to_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.clockTime"
              }
            ],
            "description": "Latest check-out time.",
            "examples": [
              "12:00"
            ]
          },
          "internet_access_coverage": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/HotelPolicies.InternetAccessCoverage"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where internet access is available. Required when `internet_access_type` is `wifi` or `wired`; `null` when it is `none`."
          },
          "internet_access_cost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cost of internet access as a decimal string, zero or greater, or `null` when access is free. Cleared when `internet_access_type` is `none`."
          },
          "parking_is_private": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the parking is private, or null when not set."
          },
          "parking_cost": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cost of parking as a decimal string, zero or greater, or `null` when parking is free. Kept when `parking_type` is `none`."
          },
          "pets_non_refundable_fee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Non-refundable fee for pets accommodation as a decimal string, or `null` when not charged. Cleared when `pets_policy` is `not_allowed`."
          },
          "pets_refundable_deposit": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Refundable deposit for pets accommodation as a decimal string, or `null` when not charged. Cleared when `pets_policy` is `not_allowed`."
          },
          "is_adults_only": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the property accepts adults only — `true` when children are not accommodated — or null when not set."
          },
          "self_checkin_checkout": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether self check-in/check-out is available, or null when not set."
          },
          "infant_max_age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "maximum": 10,
            "description": "Maximum age at which a guest counts as an infant, at most 10, or null when not set."
          },
          "children_max_age": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "maximum": 21,
            "description": "Maximum age at which a guest counts as a child, at most 21, or null when not set."
          },
          "enhanced_cleaning_practices": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the property follows enhanced cleaning practices, or null when not set."
          },
          "cleaning_practices_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Description of the property's cleaning practices, or null when not set."
          },
          "partner_hygiene_link": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Link to the partner's hygiene guidelines, or null when not set. Must be an absolute URL carrying a scheme and a host.",
            "examples": [
              "https://example.com/hygiene"
            ]
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the policy belongs to. Cannot be changed after the policy is created: a different value is refused, the same value is accepted."
          }
        },
        "description": "Hotel policy attributes accepted when updating a hotel policy. Every attribute is optional; attributes absent from the request are left unchanged. `property_id` cannot be changed — send the current value or leave it out."
      },
      "HotelPolicies.HotelPolicyUpdateRequest": {
        "type": "object",
        "required": [
          "hotel_policy"
        ],
        "properties": {
          "hotel_policy": {
            "$ref": "#/components/schemas/HotelPolicies.HotelPolicyUpdate"
          }
        },
        "description": "Request body accepted when updating a hotel policy."
      },
      "HotelPolicies.InternetAccessCoverage": {
        "type": "string",
        "enum": [
          "entire_property",
          "public_areas",
          "all_rooms",
          "some_rooms",
          "business_centre"
        ],
        "description": "Where internet access is available."
      },
      "HotelPolicies.InternetAccessType": {
        "type": "string",
        "enum": [
          "none",
          "wifi",
          "wired"
        ],
        "description": "Type of internet access available at the property."
      },
      "HotelPolicies.ParkingReservation": {
        "type": "string",
        "enum": [
          "not_available",
          "not_needed",
          "needed"
        ],
        "description": "Whether parking must be reserved in advance."
      },
      "HotelPolicies.ParkingType": {
        "type": "string",
        "enum": [
          "on_site",
          "nearby",
          "none"
        ],
        "description": "Type of parking available at the property."
      },
      "HotelPolicies.PetsPolicy": {
        "type": "string",
        "enum": [
          "allowed",
          "not_allowed",
          "by_arrangements",
          "assistive_only"
        ],
        "description": "Policy towards pets."
      },
      "HotelPolicies.SmokingPolicy": {
        "type": "string",
        "enum": [
          "no_smoking",
          "permitted_areas_only",
          "allowed"
        ],
        "description": "Policy towards smoking."
      },
      "HotelPolicies.clockTime": {
        "type": "string",
        "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]$",
        "description": "A time of day as `HH:MM` on a 24-hour clock, e.g. `14:00`.",
        "examples": [
          "14:00"
        ]
      },
      "LiveFeed.LiveFeedAlterationRequestPayload": {
        "type": "object",
        "required": [
          "id",
          "bms",
          "resolved"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifier of the alteration request at Airbnb."
          },
          "bms": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "The altered booking, in the booking revision attribute format, with the `booking_id` of the affected booking. See the Booking Revisions resource."
          },
          "resolved": {
            "type": "boolean",
            "description": "Whether the request has been resolved."
          },
          "message_thread_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the message thread the request arrived in."
          },
          "resolution": {
            "type": "string",
            "description": "The decision the request was resolved with: `accept`, `decline`, or\n`cancel` when resolved through this API; `accepted` or `cancelled` when the\nguest resolved it on Airbnb."
          },
          "status": {
            "type": "string",
            "description": "Resulting request status: `ACCEPTED`, `DECLINED`, or `CANCELED`."
          },
          "comment": {
            "type": "string",
            "description": "Who resolved the request and when."
          }
        },
        "description": "Payload of `alteration_request` events."
      },
      "LiveFeed.LiveFeedBookingEventPayload": {
        "type": "object",
        "required": [
          "amount",
          "arrival_date",
          "booking_id",
          "booking_revision_id",
          "booking_unique_id",
          "channel_id",
          "count_of_nights",
          "count_of_rooms",
          "currency",
          "customer_name",
          "ota_code"
        ],
        "properties": {
          "amount": {
            "type": "string",
            "description": "Booking total as a decimal number, in `currency`. Carries no currency symbol and no thousands separator.",
            "examples": [
              "628.56"
            ]
          },
          "arrival_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Arrival date of the booking."
          },
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking."
          },
          "booking_revision_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking revision the event was produced for."
          },
          "booking_unique_id": {
            "type": "string",
            "description": "Human-readable unique identifier of the booking."
          },
          "channel_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the channel connection the booking came through. `null` for bookings created via the Booking CRS API."
          },
          "count_of_nights": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Number of nights of the stay."
          },
          "count_of_rooms": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of non-cancelled rooms in the booking."
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Currency of the booking total."
          },
          "customer_name": {
            "type": "string",
            "description": "Guest name and surname."
          },
          "ota_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Reservation code assigned by the OTA."
          }
        },
        "description": "Payload of `booking_new`, `booking_modification`, and `booking_cancellation`\nevents."
      },
      "LiveFeed.LiveFeedBookingIssuePayload": {
        "type": "object",
        "required": [
          "booking_id",
          "booking_revision_id"
        ],
        "properties": {
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking."
          },
          "booking_revision_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking revision the issue was detected on."
          }
        },
        "description": "Payload of `booking_unmapped_room`, `booking_unmapped_rate`, and\n`undefined_channel` events."
      },
      "LiveFeed.LiveFeedEvent": {
        "type": "object",
        "required": [
          "id",
          "event",
          "property_id",
          "channel_id",
          "payload",
          "inserted_at"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique event identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "9a52c05b-ea75-4fad-aaab-21741c3be253"
            ]
          },
          "event": {
            "allOf": [
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedEventType"
              }
            ],
            "description": "Kind of the event."
          },
          "property_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Property the event belongs to. `null` when the event is not tied to a Property."
          },
          "channel_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the channel connection the event belongs to. `null` when the event\nis not tied to a channel connection, and `null` on `booking_new`,\n`booking_modification`, `booking_cancellation` and `booking_invalid_guarantee`\nevents — read the channel of those from `payload.channel_id`."
          },
          "payload": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedBookingEventPayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedBookingIssuePayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedOrphanBookingPayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedInvalidGuaranteePayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedSyncErrorPayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedMessagePayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedReservationRequestPayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedAlterationRequestPayload"
              },
              {
                "$ref": "#/components/schemas/LiveFeed.LiveFeedInquiryPayload"
              },
              {
                "type": "object",
                "unevaluatedProperties": {}
              }
            ],
            "description": "Event details; the shape depends on the event kind. `review` events carry\nthe full guest review record (see the Reviews resource) and\n`airbnb_notification` events carry the Airbnb notification content. Events\nthat can be resolved carry a `resolved` flag; once resolved, `resolution`\nand `comment` record the outcome."
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the event was recorded (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.416184"
            ]
          }
        },
        "description": "A live feed event."
      },
      "LiveFeed.LiveFeedEventResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "live_feed_event"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/LiveFeed.LiveFeedEvent"
          }
        },
        "description": "A live feed event resource."
      },
      "LiveFeed.LiveFeedEventType": {
        "type": "string",
        "enum": [
          "booking_new",
          "booking_modification",
          "booking_cancellation",
          "sync_error",
          "reservation_request",
          "booking_unmapped_room",
          "booking_unmapped_rate",
          "booking_without_property_id",
          "new_booking_after_modification",
          "wubook_flooding_detected",
          "sync_warning",
          "undefined_channel",
          "message",
          "general_error",
          "alteration_request",
          "inquiry",
          "airbnb_notification",
          "review",
          "rate_error",
          "booking_invalid_guarantee",
          "channel_removal_warning",
          "property_removal_warning"
        ],
        "description": "Kind of a live feed event."
      },
      "LiveFeed.LiveFeedInquiryPayload": {
        "type": "object",
        "required": [
          "booking_details",
          "status"
        ],
        "properties": {
          "booking_details": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Details of the inquired stay: `listing_id`, `checkin_date`, `nights`,\nguest counts, `currency`, `room_type_id`, `property_id`, and `guest_name`."
          },
          "status": {
            "type": "string",
            "description": "Status of the inquiry. Once answered, names what was sent: `preapproval` or `special_offer`."
          },
          "message_thread_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the message thread the inquiry arrived in."
          },
          "resolved": {
            "type": "boolean",
            "description": "Whether the inquiry has been resolved."
          },
          "resolution": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "The resolution the inquiry was answered with, as submitted."
          },
          "comment": {
            "type": "string",
            "description": "Who resolved the inquiry and when."
          }
        },
        "description": "Payload of `inquiry` events."
      },
      "LiveFeed.LiveFeedInvalidGuaranteePayload": {
        "type": "object",
        "required": [
          "unique_id",
          "channel_id"
        ],
        "properties": {
          "unique_id": {
            "type": "string",
            "description": "Human-readable unique identifier of the booking."
          },
          "channel_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the channel connection the booking came through. `null` for bookings created via the Booking CRS API."
          }
        },
        "description": "Payload of `booking_invalid_guarantee` events."
      },
      "LiveFeed.LiveFeedMessagePayload": {
        "type": "object",
        "required": [
          "id",
          "booking_id",
          "ota_message_id",
          "message",
          "message_thread_id",
          "have_attachment",
          "meta",
          "sender",
          "inserted_at"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the message."
          },
          "booking_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the booking the message thread belongs to. `null` for threads without a booking (e.g. Airbnb inquiries)."
          },
          "ota_message_id": {
            "type": "string",
            "description": "Identifier of the message at the OTA."
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Message text, truncated to 50 characters. `null` for attachment-only messages."
          },
          "message_thread_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the message thread."
          },
          "have_attachment": {
            "type": "boolean",
            "description": "Whether the message carries an attachment."
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Additional message details. `null` for plain messages."
          },
          "sender": {
            "type": "string",
            "description": "Who sent the message. Possible values: `guest`, `property`, `system`, `agent`."
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the message was received (ISO 8601, no timezone offset)."
          }
        },
        "description": "Payload of `message` events."
      },
      "LiveFeed.LiveFeedOrphanBookingPayload": {
        "type": "object",
        "required": [
          "booking_id"
        ],
        "properties": {
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking."
          }
        },
        "description": "Payload of `booking_without_property_id` events."
      },
      "LiveFeed.LiveFeedReservationRequestPayload": {
        "type": "object",
        "required": [
          "bms",
          "resolved"
        ],
        "properties": {
          "bms": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "The requested booking, in the booking revision attribute format. See the Booking Revisions resource."
          },
          "resolved": {
            "type": "boolean",
            "description": "Whether the request has been resolved."
          },
          "message_thread_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the message thread the request arrived in."
          },
          "resolution": {
            "type": "string",
            "description": "Outcome of the resolution: `accepted` or `declined`."
          },
          "comment": {
            "type": "string",
            "description": "Who resolved the request and when."
          }
        },
        "description": "Payload of `reservation_request` events."
      },
      "LiveFeed.LiveFeedResolution": {
        "type": "object",
        "properties": {
          "accept": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "string",
                "enum": [
                  "accept",
                  "decline",
                  "cancel"
                ]
              }
            ],
            "description": "The decision. For `reservation_request` events: required boolean — `true`\naccepts the reservation, `false` declines it. For `alteration_request`\nevents: required, one of `accept` (apply the change), `decline` (refuse the\nguest's request), or `cancel` (withdraw an alteration you initiated). Not\nused for `inquiry` events — answer those with `type`."
          },
          "reason": {
            "type": "string",
            "description": "Reason a reservation request is declined. Possible values:\n`dates_not_available`, `not_a_good_fit`, `waiting_for_better_reservation`,\n`not_comfortable`. Defaults to `not_comfortable`. Applies to\n`reservation_request` events when `accept` is `false`."
          },
          "decline_message_to_guest": {
            "type": "string",
            "description": "Message sent to the guest when declining. Applies to `reservation_request` events when `accept` is `false`."
          },
          "decline_message_to_airbnb": {
            "type": "string",
            "description": "Message sent to Airbnb when declining. Applies to `reservation_request` events when `accept` is `false`."
          },
          "type": {
            "type": "string",
            "enum": [
              "preapproval",
              "special_offer"
            ],
            "description": "How to answer an inquiry: pre-approve the guest to book (`preapproval`) or\nsend a special offer (`special_offer`) — the only two answers an inquiry\ntakes. Required for `inquiry` events."
          },
          "total_price": {
            "type": "integer",
            "format": "int32",
            "description": "Total price of the stay offered with a special offer, as a whole number in\nthe listing's currency. Must include all reservation nights and standard\nfees such as the cleaning fee; taxes and security deposits are not\nincluded. The Airbnb service fee is deducted from this amount. Required\nfor `inquiry` events when `type` is `special_offer`."
          },
          "block_instant_booking": {
            "type": "boolean",
            "description": "Whether to block other guests from booking the same dates through Instant\nBook while the pre-approval is pending. Defaults to `false`. Applies to\n`inquiry` events answered with a pre-approval; ignored for special offers."
          }
        },
        "description": "Resolution of an actionable live feed event. Which fields apply depends on\nthe event kind; unrelated fields are ignored."
      },
      "LiveFeed.LiveFeedResolutionRequest": {
        "type": "object",
        "required": [
          "resolution"
        ],
        "properties": {
          "resolution": {
            "$ref": "#/components/schemas/LiveFeed.LiveFeedResolution"
          }
        },
        "description": "Request payload for resolving a live feed event."
      },
      "LiveFeed.LiveFeedSyncErrorPayload": {
        "type": "object",
        "required": [
          "channel_id",
          "error_type"
        ],
        "properties": {
          "channel_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the channel connection the error occurred on."
          },
          "error_type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Error code, e.g. `price_too_low`, `validation_error`, or `general_error`."
          },
          "log_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the channel event log entry with the error details."
          },
          "channel_event_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the channel event log entry with the error details."
          },
          "channel": {
            "type": "string",
            "description": "Short code of the channel, e.g. `BDC`."
          },
          "channel_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Display title of the channel connection."
          },
          "property_name": {
            "type": "string",
            "description": "Display title of the Property."
          }
        },
        "description": "Payload of `sync_error` and `rate_error` events."
      },
      "MessageThreads.ListedMessage": {
        "type": "object",
        "required": [
          "message",
          "attachments",
          "sender",
          "inserted_at",
          "updated_at",
          "status",
          "error_code"
        ],
        "properties": {
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Message text. A message carries either text or attachments, never both: `null` when `attachments` is non-empty.",
            "examples": [
              "Thanks for your message."
            ]
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Links to the attachments of the message — absolute URLs pointing at the\nAttachments download endpoint. Empty when the message carries text.",
            "examples": [
              [
                "https://staging.channex.io/api/v1/attachments/4e160f0b-016a-424a-a30d-a9f0a8b1cbaa/8f14e45f/photo.jpeg"
              ]
            ]
          },
          "sender": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MessageThreads.MessageSender"
              }
            ],
            "description": "Message direction: who sent it."
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the message was received (ISO 8601, no timezone offset).",
            "examples": [
              "2021-07-28T04:25:15.000000"
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the message was updated (ISO 8601, no timezone offset).",
            "examples": [
              "2021-07-28T04:25:22.613482"
            ]
          },
          "meta": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Extra details carried by the message, varying by what produced it — an Airbnb inquiry\nrecords `status`, `live_feed_event_id` and `booking_details` (dates, guest counts,\nprices). Absent when the message has none."
          },
          "status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageThreads.MessageStatus"
              },
              {
                "type": "null"
              }
            ],
            "description": "Delivery status of a message that Channex sends: `sender` is `property` or `agent`.\n`sent` means that the provider accepted the message, not that the guest got or read it.\nMessages sent before the status existed read `sent`. A `guest` or `system` message answers `null`."
          },
          "error_code": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MessageThreads.MessageErrorCode"
              },
              {
                "type": "null"
              }
            ],
            "description": "Why the send failed. `null` unless `status` is `failed`, and `null` on a `guest` or `system` message."
          }
        },
        "description": "A message as the thread and booking message listings return it: `Message` with its delivery status."
      },
      "MessageThreads.Message": {
        "type": "object",
        "required": [
          "message",
          "attachments",
          "sender",
          "inserted_at",
          "updated_at"
        ],
        "properties": {
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Message text. A message carries either text or attachments, never both: `null` when `attachments` is non-empty.",
            "examples": [
              "Thanks for your message."
            ]
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Links to the attachments of the message — absolute URLs pointing at the\nAttachments download endpoint. Empty when the message carries text.",
            "examples": [
              [
                "https://staging.channex.io/api/v1/attachments/4e160f0b-016a-424a-a30d-a9f0a8b1cbaa/8f14e45f/photo.jpeg"
              ]
            ]
          },
          "sender": {
            "allOf": [
              {
                "$ref": "#/components/schemas/MessageThreads.MessageSender"
              }
            ],
            "description": "Message direction: who sent it."
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the message was received (ISO 8601, no timezone offset).",
            "examples": [
              "2021-07-28T04:25:15.000000"
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the message was updated (ISO 8601, no timezone offset).",
            "examples": [
              "2021-07-28T04:25:22.613482"
            ]
          },
          "meta": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Extra details carried by the message, varying by what produced it — an Airbnb inquiry\nrecords `status`, `live_feed_event_id` and `booking_details` (dates, guest counts,\nprices). Absent when the message has none."
          }
        },
        "description": "A chat message inside a Message Thread."
      },
      "MessageThreads.MessageCreate": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "description": "Message text to send. Takes precedence: when present, `attachment_id` is ignored.",
            "examples": [
              "Thanks for your message."
            ]
          },
          "attachment_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Identifier of an attachment uploaded through the Attachments endpoint, to send as the message. Ignored when `message` is present."
          }
        },
        "description": "Attributes accepted when sending a message. Provide either `message` or `attachment_id` —\na message carries text or an attachment, never both. When `message` is present,\n`attachment_id` is ignored."
      },
      "MessageThreads.MessageCreateRequest": {
        "type": "object",
        "required": [
          "message"
        ],
        "properties": {
          "message": {
            "$ref": "#/components/schemas/MessageThreads.MessageCreate"
          }
        },
        "description": "Request body accepted when sending a message."
      },
      "MessageThreads.MessageErrorCode": {
        "type": "string",
        "enum": [
          "rate_limited",
          "invalid_credentials",
          "not_supported",
          "rejected_by_ota",
          "ota_unavailable",
          "gave_up"
        ],
        "description": "Why the send of a message failed."
      },
      "MessageThreads.MessageListResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "message"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/MessageThreads.ListedMessage"
          },
          "relationships": {
            "$ref": "#/components/schemas/MessageThreads.MessageRelationships"
          }
        },
        "description": "A message resource, as returned by the thread and booking message listings."
      },
      "MessageThreads.MessageRelationships": {
        "type": "object",
        "required": [
          "message_thread"
        ],
        "properties": {
          "message_thread": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "message_thread"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Thread the message belongs to."
          },
          "user": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "user"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "User who sent the message. Present only on messages sent by a property-side user."
          }
        },
        "description": "Relationships of a message resource."
      },
      "MessageThreads.MessageResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "message"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/MessageThreads.Message"
          },
          "relationships": {
            "$ref": "#/components/schemas/MessageThreads.MessageRelationships"
          }
        },
        "description": "A message resource, as returned by sending and pulling messages."
      },
      "MessageThreads.MessageSender": {
        "type": "string",
        "enum": [
          "guest",
          "property",
          "system",
          "agent"
        ],
        "description": "Who sent a message."
      },
      "MessageThreads.MessageStatus": {
        "type": "string",
        "enum": [
          "queued",
          "sending",
          "sent",
          "failed"
        ],
        "description": "Delivery status of a message sent to the provider."
      },
      "PaymentApp.ConnectLinkDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "data": {
            "type": "object",
            "properties": {
              "link": {
                "type": "string",
                "format": "uri",
                "description": "Link to the provider's connection flow. Open it in a browser to complete the connection."
              }
            },
            "required": [
              "link"
            ]
          }
        },
        "description": "Response document carrying the provider connection link."
      },
      "PaymentApp.ConnectRequest": {
        "type": "object",
        "required": [
          "provider"
        ],
        "properties": {
          "provider": {
            "type": "string",
            "description": "Payment provider kind.",
            "examples": [
              "stripe"
            ]
          },
          "title": {
            "type": "string",
            "description": "Provider connection title.",
            "examples": [
              "Test"
            ]
          },
          "redirect_url": {
            "type": "string",
            "description": "URL to redirect the user to after the connection flow completes.",
            "examples": [
              "https://example.com"
            ]
          }
        },
        "description": "Request body accepted when connecting a payment provider."
      },
      "PaymentApp.DisconnectRequest": {
        "type": "object",
        "required": [
          "payment_provider_id"
        ],
        "properties": {
          "payment_provider_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the payment provider connection to disconnect."
          }
        },
        "description": "Request body accepted when disconnecting a payment provider."
      },
      "PaymentApp.DownloadCsvRequest": {
        "type": "object",
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "description": "Token of the export to download.",
            "examples": [
              "WDso87A_U8D18wyEoubzBfi7oNoc7bdF2iaSb6CCJbk="
            ]
          }
        },
        "description": "Request body accepted when downloading a transactions export."
      },
      "PaymentApp.ExportTokenDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "data": {
            "type": "object",
            "properties": {
              "token": {
                "type": "string",
                "description": "Token of the export. Pass it to the download endpoint to fetch the file.",
                "examples": [
                  "WDso87A_U8D18wyEoubzBfi7oNoc7bdF2iaSb6CCJbk="
                ]
              }
            },
            "required": [
              "token"
            ]
          }
        },
        "description": "Response document carrying a CSV export token."
      },
      "PaymentApp.PaymentAppTransaction": {
        "type": "object",
        "required": [
          "id",
          "booking_id",
          "user_id",
          "amount",
          "currency",
          "type",
          "ip_address",
          "payment_provider_id",
          "inserted_at",
          "updated_at"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Transaction identifier."
          },
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking the transaction belongs to."
          },
          "user_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the user who initiated the transaction. `null` for transactions without a user."
          },
          "amount": {
            "type": "string",
            "description": "Transaction amount as a decimal string.",
            "examples": [
              "100.11"
            ]
          },
          "currency": {
            "type": "string",
            "description": "Currency of the transaction.",
            "examples": [
              "USD"
            ]
          },
          "type": {
            "$ref": "#/components/schemas/BookingPayments.PaymentTransactionType"
          },
          "ip_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "IP address the transaction was initiated from. `null` when not recorded.",
            "examples": [
              "185.229.190.76"
            ]
          },
          "payment_provider_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the payment provider that processed the transaction."
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Provider-specific transaction details.",
            "examples": [
              {
                "id": "pi123"
              }
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "description": "A payment transaction reported by the Payment Application."
      },
      "PaymentApp.PaymentAppTransactionRelationships": {
        "type": "object",
        "required": [
          "booking",
          "payment",
          "payment_provider"
        ],
        "properties": {
          "user": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Authentication.EmbeddedUser"
              }
            ],
            "description": "The user who initiated the transaction. Absent for transactions without a user."
          },
          "booking": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PaymentApp.TransactionBookingRelationship"
              }
            ],
            "description": "The booking the transaction belongs to."
          },
          "payment": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PaymentApp.TransactionPaymentRelationship"
              }
            ],
            "description": "The payment the transaction belongs to."
          },
          "payment_provider": {
            "allOf": [
              {
                "$ref": "#/components/schemas/PaymentApp.TransactionPaymentProviderRelationship"
              }
            ],
            "description": "The payment provider that processed the transaction."
          }
        },
        "description": "Relationships of a transaction resource."
      },
      "PaymentApp.PaymentAppTransactionResource": {
        "type": "object",
        "required": [
          "attributes",
          "relationships"
        ],
        "properties": {
          "attributes": {
            "$ref": "#/components/schemas/PaymentApp.PaymentAppTransaction"
          },
          "relationships": {
            "$ref": "#/components/schemas/PaymentApp.PaymentAppTransactionRelationships"
          }
        },
        "description": "Transaction resource. Carries attributes and relationships — no id or type."
      },
      "PaymentApp.PaymentProvider": {
        "type": "object",
        "required": [
          "id",
          "is_active",
          "is_default",
          "provider",
          "title"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Provider connection identifier. Mirrors the resource `id`."
          },
          "is_active": {
            "type": "boolean",
            "description": "Whether the provider connection is active."
          },
          "is_default": {
            "type": "boolean",
            "description": "Whether the provider connection is the default one."
          },
          "details": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Provider-specific connection details.",
            "examples": [
              {
                "account_id": "xyz123"
              }
            ]
          },
          "provider": {
            "type": "string",
            "description": "Payment provider kind.",
            "examples": [
              "stripe"
            ]
          },
          "title": {
            "type": "string",
            "description": "Provider connection title.",
            "examples": [
              "Test"
            ]
          }
        },
        "description": "A payment provider connection."
      },
      "PaymentApp.PaymentProviderResource": {
        "type": "object",
        "required": [
          "id",
          "type",
          "attributes"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "payment_provider"
            ]
          },
          "attributes": {
            "$ref": "#/components/schemas/PaymentApp.PaymentProvider"
          }
        },
        "description": "Payment provider resource."
      },
      "PaymentApp.PaymentProviderUpdateParams": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "Provider connection title.",
            "examples": [
              "Test"
            ]
          }
        },
        "description": "Attributes accepted when updating a payment provider connection."
      },
      "PaymentApp.PaymentProvidersDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentApp.PaymentProviderResource"
            }
          }
        },
        "description": "Response document for payment provider lists."
      },
      "PaymentApp.SetDefaultProviderRequest": {
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the payment provider connection to make the default."
          }
        },
        "description": "Request body accepted when making a payment provider connection the default one."
      },
      "PaymentApp.SuccessFlagDocument": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          }
        },
        "description": "Response document carrying only a success flag."
      },
      "PaymentApp.TransactionBookingRelationship": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "type": {
                "type": "string",
                "enum": [
                  "booking"
                ]
              },
              "attributes": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "reference": {
                    "type": "string",
                    "description": "Booking reference."
                  }
                },
                "required": [
                  "id",
                  "reference"
                ]
              }
            },
            "required": [
              "id",
              "type",
              "attributes"
            ]
          }
        },
        "description": "The booking a transaction belongs to, embedded as a relationship."
      },
      "PaymentApp.TransactionListDocument": {
        "type": "object",
        "required": [
          "meta",
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "meta": {
            "$ref": "#/components/schemas/BookingPayments.PaymentMeta"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentApp.PaymentAppTransactionResource"
            }
          }
        },
        "description": "Response document for the transactions report."
      },
      "PaymentApp.TransactionPaymentProviderRelationship": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "type": {
                "type": "string",
                "enum": [
                  "payment_provider"
                ]
              },
              "attributes": {
                "$ref": "#/components/schemas/PaymentApp.PaymentProvider"
              }
            },
            "required": [
              "id",
              "type",
              "attributes"
            ]
          }
        },
        "description": "The payment provider of a transaction, embedded as a relationship."
      },
      "PaymentApp.TransactionPaymentRelationship": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              "type": {
                "type": "string",
                "enum": [
                  "payment"
                ]
              }
            },
            "required": [
              "id",
              "type"
            ]
          }
        },
        "description": "The payment a transaction belongs to, as a linkage (id and type only)."
      },
      "PaymentApp.UpdateProviderRequest": {
        "type": "object",
        "required": [
          "id",
          "params"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the payment provider connection to update."
          },
          "params": {
            "$ref": "#/components/schemas/PaymentApp.PaymentProviderUpdateParams"
          }
        },
        "description": "Request body accepted when updating a payment provider connection."
      },
      "Photos.EmbeddedPhotoWrite": {
        "type": "object",
        "required": [
          "url",
          "kind"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of an existing photo of this parent to update in place or, with `is_removed`, to remove. Omit to attach a new photo. An identifier naming no photo of this parent leaves the list unchanged.",
            "examples": [
              "cc673f90-8d65-498d-9ee7-b4b39f8df3ee"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "URL to fetch the image from: the temporary URL returned by the upload endpoint, passed unchanged, or any reachable image URL. The image is copied into Channex storage, and responses carry that copy's URL rather than this one. Required in every entry; an entry without `id` whose URL matches a photo already attached updates that photo.",
            "examples": [
              "https://example.com/temporaryphotos/a66edb22-47da-4da8-bab5-3b6f4056256f.png"
            ]
          },
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Photos.PhotoKind"
              }
            ],
            "description": "Kind of photo. Required when attaching or updating a photo; an entry that only removes one may omit it."
          },
          "author": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo author, or null.",
            "examples": [
              "John Doe"
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo description, or null.",
            "examples": [
              "Room View"
            ]
          },
          "is_removed": {
            "type": "boolean",
            "description": "Set to `true` to remove the photo named by `id` or `url` from the parent. The photo is deleted and is no longer readable through the Photos resource. Defaults to `false`."
          }
        },
        "description": "A photo in a parent resource's `content.photos` list."
      },
      "Photos.Photo": {
        "type": "object",
        "required": [
          "id",
          "property_id",
          "room_type_id",
          "kind",
          "position",
          "author",
          "description",
          "url"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique photo identifier.",
            "examples": [
              "cc673f90-8d65-498d-9ee7-b4b39f8df3ee"
            ]
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the photo belongs to. Cannot be changed after the photo is created.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "room_type_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Room Type the photo belongs to, or null when the photo is attached at property level. Cannot be changed after the photo is created."
          },
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Photos.PhotoKind"
              }
            ],
            "description": "Kind of photo: `photo` for the property or room type itself, `ad` for an advertising image, `menu` for a restaurant menu. Defaults to `photo`."
          },
          "position": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Position in the photo list of the property or, for a room type photo, of that room type. Positions run from `0` without gaps and `0` designates the cover photo. On create the photo is inserted at this position, or appended when omitted; on update it is moved there. The other photos shift to keep the positions contiguous, and a value past the end places the photo last.",
            "examples": [
              0
            ]
          },
          "author": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo author, or null. An empty string is stored as `null`.",
            "examples": [
              "John Doe"
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo description, or null. An empty string is stored as `null`.",
            "examples": [
              "Room View"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "URL of the image as served by Channex. The create response carries a placeholder image URL; once the source image has been fetched and stored, typically within a few seconds, the photo carries the URL of the stored copy — read the photo back to obtain it. A source image that cannot be fetched leaves the placeholder in place.",
            "examples": [
              "https://images.channex.io/1747b751-28c0-47db-742a-40f62a186a00/"
            ]
          }
        },
        "description": "A photo as returned in responses: every attribute is present."
      },
      "Photos.PhotoCreate": {
        "type": "object",
        "required": [
          "property_id",
          "url"
        ],
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the photo belongs to. Cannot be changed after the photo is created.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "room_type_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Room Type the photo belongs to, or null when the photo is attached at property level. Cannot be changed after the photo is created."
          },
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Photos.PhotoKind"
              }
            ],
            "description": "Kind of photo: `photo` for the property or room type itself, `ad` for an advertising image, `menu` for a restaurant menu. Defaults to `photo`."
          },
          "position": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Position in the photo list of the property or, for a room type photo, of that room type. Positions run from `0` without gaps and `0` designates the cover photo. On create the photo is inserted at this position, or appended when omitted; on update it is moved there. The other photos shift to keep the positions contiguous, and a value past the end places the photo last.",
            "examples": [
              0
            ]
          },
          "author": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo author, or null. An empty string is stored as `null`.",
            "examples": [
              "John Doe"
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo description, or null. An empty string is stored as `null`.",
            "examples": [
              "Room View"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "URL to fetch the image from: the temporary URL returned by the upload endpoint, passed unchanged, or any reachable image URL, scheme included. The image is copied into Channex storage, and responses carry that copy's URL rather than this one. The same source URL can be attached to a property, or to one of its room types, only once; a duplicate is refused with `422 Unprocessable Entity` on `url`. Cannot be changed after the photo is created.",
            "examples": [
              "https://example.com/temporaryphotos/a66edb22-47da-4da8-bab5-3b6f4056256f.png"
            ]
          }
        },
        "description": "Photo attributes accepted when creating a photo."
      },
      "Photos.PhotoCreateRequest": {
        "type": "object",
        "required": [
          "photo"
        ],
        "properties": {
          "photo": {
            "$ref": "#/components/schemas/Photos.PhotoCreate"
          }
        },
        "description": "Request body accepted when creating a photo."
      },
      "Photos.PhotoKind": {
        "type": "string",
        "enum": [
          "photo",
          "ad",
          "menu"
        ],
        "description": "Kind of photo: `photo` for the property or room type itself, `ad` for an advertising image, `menu` for a restaurant menu. Defaults to `photo`."
      },
      "Photos.PhotoResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "photo"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Photos.Photo"
          }
        },
        "description": "A photo as returned in responses."
      },
      "Photos.PhotoUpdate": {
        "type": "object",
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the photo belongs to. Cannot be changed after the photo is created.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "room_type_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Room Type the photo belongs to, or null when the photo is attached at property level. Cannot be changed after the photo is created."
          },
          "kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Photos.PhotoKind"
              }
            ],
            "description": "Kind of photo: `photo` for the property or room type itself, `ad` for an advertising image, `menu` for a restaurant menu. Defaults to `photo`."
          },
          "position": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Position in the photo list of the property or, for a room type photo, of that room type. Positions run from `0` without gaps and `0` designates the cover photo. On create the photo is inserted at this position, or appended when omitted; on update it is moved there. The other photos shift to keep the positions contiguous, and a value past the end places the photo last.",
            "examples": [
              0
            ]
          },
          "author": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo author, or null. An empty string is stored as `null`.",
            "examples": [
              "John Doe"
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Photo description, or null. An empty string is stored as `null`.",
            "examples": [
              "Room View"
            ]
          }
        },
        "description": "Photo attributes accepted when updating a photo. Every attribute is optional; attributes absent from the request are left unchanged. `property_id` and `room_type_id` cannot be changed — send the current value or leave them out. The image itself cannot be changed: to replace it, delete the photo and create a new one."
      },
      "Photos.PhotoUpdateRequest": {
        "type": "object",
        "required": [
          "photo"
        ],
        "properties": {
          "photo": {
            "$ref": "#/components/schemas/Photos.PhotoUpdate"
          }
        },
        "description": "Request body accepted when updating a photo."
      },
      "Photos.PhotoUploadForm": {
        "type": "object",
        "properties": {
          "photo": {}
        },
        "required": [
          "photo"
        ]
      },
      "Photos.UploadResponse": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Temporary URL of the uploaded file. Pass it to create unchanged; its host and path are not part of the contract.",
            "examples": [
              "https://example.com/temporaryphotos/a66edb22-47da-4da8-bab5-3b6f4056256f.png"
            ]
          }
        },
        "description": "Result of uploading a photo file: the temporary URL to pass to create. Not a JSON:API resource."
      },
      "Properties.MinStayType": {
        "type": "string",
        "enum": [
          "both",
          "arrival",
          "through"
        ],
        "description": "Simplified handling of Min Stay restrictions. `both` keeps Min Stay Arrival and Min Stay Through separate. Set `arrival` or `through` when a system works with only one Min Stay type: min stay changes are then accepted under a single `min_stay` key and applied as that type in channel mappings."
      },
      "Properties.Property": {
        "type": "object",
        "required": [
          "id",
          "is_active",
          "expected_removal_date",
          "acc_channels_count",
          "property_category",
          "max_count_of_room_types",
          "max_count_of_rate_plans",
          "max_count_of_occupancies",
          "max_count_of_users",
          "title",
          "currency",
          "email",
          "phone",
          "zip_code",
          "country",
          "state",
          "city",
          "address",
          "longitude",
          "latitude",
          "timezone",
          "property_type",
          "logo_url",
          "website",
          "hotel_policy_id",
          "default_cancellation_policy_id",
          "default_tax_set_id",
          "location_precision",
          "min_stay_type",
          "settings",
          "content"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique property identifier.",
            "examples": [
              "716305c4-561a-4561-a187-7f5b8aeb5920"
            ]
          },
          "is_active": {
            "type": "boolean",
            "description": "Whether the property is active.",
            "examples": [
              true
            ]
          },
          "is_demo": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "Marks a demo property, pre-filled with sample data.\nPresent on a demo property only — a property created through `POST /properties`\ncarries no such attribute.",
            "examples": [
              true
            ]
          },
          "expected_removal_date": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Date the property is expected to be removed, or null.",
            "examples": [
              "2026-12-31"
            ]
          },
          "acc_channels_count": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Count of connected channels. Read-only aggregate."
          },
          "property_category": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Properties.PropertyCategory"
              },
              {
                "type": "null"
              }
            ],
            "description": "Classification category of the property, or null when it is not set. Read-only.",
            "examples": [
              "hotel"
            ]
          },
          "max_count_of_room_types": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Maximum number of room types allowed. Read-only limit.",
            "examples": [
              20
            ]
          },
          "max_count_of_rate_plans": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Maximum number of rate plans allowed. Read-only limit.",
            "examples": [
              200
            ]
          },
          "max_count_of_occupancies": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Maximum number of occupancy options allowed. Read-only limit.",
            "examples": [
              8
            ]
          },
          "max_count_of_users": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Maximum number of users allowed. Read-only limit.",
            "examples": [
              20
            ]
          },
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Property title, as shown in the system.",
            "examples": [
              "Demo Hotel"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Default currency for nested entities, and the property's default currency for connected third-party services.",
            "examples": [
              "GBP"
            ]
          },
          "email": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              },
              {
                "type": "null"
              }
            ],
            "description": "Contact email. Passed to connected third-party services as the property's contact email. Optional at setup, required before connecting a 3rd-party service."
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 32,
            "description": "Contact phone. Digits, spaces, brackets and special characters; max 32 chars. Passed to connected third-party services as the property's contact phone. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "+44 99 9999 9999"
            ]
          },
          "zip_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 32,
            "description": "ZIP/postal code (max 32 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "XXX XXX"
            ]
          },
          "country": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.country"
              },
              {
                "type": "null"
              }
            ],
            "description": "Country of the property. ISO 3166-1 alpha-2 country code. Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "GB"
            ]
          },
          "state": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "State/region (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "Wales"
            ]
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "City (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "Cardiff"
            ]
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "Street address (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "123 High Street"
            ]
          },
          "longitude": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 12,
            "description": "Longitude as a decimal string in the range −180..180 (max 7 decimals). Derived from the address when the property is saved without one. Part of the property coordinates passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "-0.2416781"
            ]
          },
          "latitude": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 11,
            "description": "Latitude as a decimal string in the range −90..90 (max 7 decimals). Derived from the address when the property is saved without one. Part of the property coordinates passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "51.5285582"
            ]
          },
          "timezone": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.timezone"
              },
              {
                "type": "null"
              }
            ],
            "description": "Time zone of the property, or null when it is not set. Sending `null` clears it.\n\nTime zone name from the IANA Time Zone Database (the \"tz database\"), published at\nhttps://www.iana.org/time-zones — background at\nhttps://en.wikipedia.org/wiki/Tz_database. See the `/timezones` endpoint for the\nvalues this API accepts.",
            "examples": [
              "Europe/London"
            ]
          },
          "property_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Properties.PropertyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Type of the property, or null when it is not set. Sending `null` clears it.\n\n**Set this value — it affects billing. Use `hotel` for a hotel and `apartment`\nfor a vacation rental.**"
          },
          "logo_url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL to the property logo; copied into Channex media storage.",
            "examples": [
              "https://example.com/logo.png"
            ]
          },
          "website": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL to the property website.",
            "examples": [
              "https://example.com"
            ]
          },
          "hotel_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's hotel policy, or null. Sending `null` clears it."
          },
          "default_cancellation_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's default cancellation policy, or null."
          },
          "default_tax_set_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's default tax set, or null."
          },
          "location_precision": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Location precision, or null."
          },
          "min_stay_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Properties.MinStayType"
              }
            ],
            "description": "Simplified Min Stay restriction handling for the property. Mirrors `settings.min_stay_type`: writing either attribute updates both.",
            "deprecated": true
          },
          "settings": {
            "$ref": "#/components/schemas/Properties.PropertySettings"
          },
          "content": {
            "$ref": "#/components/schemas/Properties.PropertyContent"
          }
        },
        "description": "A property (hotel, apartment, etc.) as returned in responses: every attribute is present."
      },
      "Properties.PropertyCategory": {
        "type": "string",
        "enum": [
          "camping",
          "hotel",
          "vacation_rental"
        ],
        "description": "Classification category of the property."
      },
      "Properties.PropertyContent": {
        "type": "object",
        "required": [
          "description",
          "important_information",
          "photos"
        ],
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Property description. Null by default.",
            "examples": [
              "A lovely hotel in the city center."
            ]
          },
          "important_information": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Important information, included in booking confirmation emails.",
            "examples": [
              "Check-in from 3 PM. No pets allowed."
            ]
          },
          "photos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Photos.Photo"
            },
            "description": "Photos attached to the property. A property holds at most 30 of them, counted separately from the photos of its room types. See the Photos resource for the full model and management endpoints."
          }
        },
        "description": "Property content as returned in responses: every field is present."
      },
      "Properties.PropertyContentWrite": {
        "type": "object",
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Property description. Null by default.",
            "examples": [
              "A lovely hotel in the city center."
            ]
          },
          "important_information": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Important information, included in booking confirmation emails.",
            "examples": [
              "Check-in from 3 PM. No pets allowed."
            ]
          },
          "photos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Photos.EmbeddedPhotoWrite"
            },
            "description": "Photos to attach to the property. The list is merged into the property's photos rather than replacing them: an entry with a new `url` attaches a photo, an entry carrying `id` updates that photo, and photos the list does not name are kept. Remove a photo through the Photos resource, or by sending its `id` with `is_removed: true`. A property holds at most 30 photos, counted separately from the photos of its room types: a request that would take the count past 30 is refused, while one that does not raise it is accepted even for a property already holding more, and deleting a photo frees its place."
          }
        },
        "description": "Property content accepted on create and update."
      },
      "Properties.PropertyCreate": {
        "type": "object",
        "required": [
          "title",
          "currency"
        ],
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Property title, as shown in the system.",
            "examples": [
              "Demo Hotel"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Default currency for nested entities, and the property's default currency for connected third-party services.",
            "examples": [
              "GBP"
            ]
          },
          "email": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              },
              {
                "type": "null"
              }
            ],
            "description": "Contact email. Passed to connected third-party services as the property's contact email. Optional at setup, required before connecting a 3rd-party service."
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 32,
            "description": "Contact phone. Digits, spaces, brackets and special characters; max 32 chars. Passed to connected third-party services as the property's contact phone. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "+44 99 9999 9999"
            ]
          },
          "zip_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 32,
            "description": "ZIP/postal code (max 32 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "XXX XXX"
            ]
          },
          "country": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.country"
              },
              {
                "type": "null"
              }
            ],
            "description": "Country of the property. ISO 3166-1 alpha-2 country code. Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "GB"
            ]
          },
          "state": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "State/region (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "Wales"
            ]
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "City (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "Cardiff"
            ]
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "Street address (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "123 High Street"
            ]
          },
          "longitude": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 12,
            "description": "Longitude as a decimal string in the range −180..180 (max 7 decimals). Derived from the address when the property is saved without one. Part of the property coordinates passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "-0.2416781"
            ]
          },
          "latitude": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 11,
            "description": "Latitude as a decimal string in the range −90..90 (max 7 decimals). Derived from the address when the property is saved without one. Part of the property coordinates passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "51.5285582"
            ]
          },
          "timezone": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.timezone"
              },
              {
                "type": "null"
              }
            ],
            "description": "Time zone of the property, or null when it is not set. Sending `null` clears it.\n\nTime zone name from the IANA Time Zone Database (the \"tz database\"), published at\nhttps://www.iana.org/time-zones — background at\nhttps://en.wikipedia.org/wiki/Tz_database. See the `/timezones` endpoint for the\nvalues this API accepts.",
            "examples": [
              "Europe/London"
            ]
          },
          "property_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Properties.PropertyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Type of the property, or null when it is not set. Sending `null` clears it.\n\n**Set this value — it affects billing. Use `hotel` for a hotel and `apartment`\nfor a vacation rental.**"
          },
          "logo_url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL to the property logo; copied into Channex media storage.",
            "examples": [
              "https://example.com/logo.png"
            ]
          },
          "website": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL to the property website.",
            "examples": [
              "https://example.com"
            ]
          },
          "hotel_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's hotel policy, or null. Sending `null` clears it."
          },
          "default_cancellation_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's default cancellation policy, or null."
          },
          "default_tax_set_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's default tax set, or null."
          },
          "location_precision": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Location precision, or null."
          },
          "min_stay_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Properties.MinStayType"
              }
            ],
            "description": "Simplified Min Stay restriction handling for the property. Mirrors `settings.min_stay_type`: writing either attribute updates both.",
            "deprecated": true
          },
          "facilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Property Facility IDs to associate. See the Property Facilities endpoint for the available identifiers. In responses, facilities appear under relationships."
          },
          "group_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the group to place the property in on create. Defaults to the user's Default Group when omitted; an unknown group is refused with `422`. Not accepted on update: the value is ignored there and the property's groups are left unchanged. In responses the group appears under relationships."
          },
          "settings": {
            "$ref": "#/components/schemas/Properties.PropertySettingsWrite"
          },
          "content": {
            "$ref": "#/components/schemas/Properties.PropertyContentWrite"
          }
        },
        "description": "Property attributes accepted when creating a property. `title` and `currency` are required; every other attribute is optional and falls back to its default."
      },
      "Properties.PropertyCreateRequest": {
        "type": "object",
        "required": [
          "property"
        ],
        "properties": {
          "property": {
            "$ref": "#/components/schemas/Properties.PropertyCreate"
          }
        },
        "description": "Request body accepted when creating a property."
      },
      "Properties.PropertyListRelationships": {
        "type": "object",
        "required": [
          "users",
          "groups"
        ],
        "properties": {
          "users": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Authentication.EmbeddedUser"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Users with access to the property."
          },
          "groups": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "type",
                    "id",
                    "attributes"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "group"
                      ]
                    },
                    "id": {
                      "$ref": "#/components/schemas/Common.Scalars.id"
                    },
                    "attributes": {
                      "$ref": "#/components/schemas/Common.JsonApi.OptionAttributes"
                    }
                  },
                  "description": "A lightweight JSON:API resource returned by `/options` endpoints — id + title only, no relationships or pagination."
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Groups the property belongs to."
          }
        },
        "description": "Relationships of a property in list responses."
      },
      "Properties.PropertyListResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "property"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Properties.Property"
          },
          "relationships": {
            "$ref": "#/components/schemas/Properties.PropertyListRelationships"
          }
        },
        "description": "A property as returned by the list endpoint."
      },
      "Properties.PropertyOption": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "property"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Properties.PropertyOptionAttributes"
          }
        },
        "description": "A lightweight property option for selectors — no relationships or pagination."
      },
      "Properties.PropertyOptionAttributes": {
        "type": "object",
        "required": [
          "id",
          "title",
          "is_owner",
          "currency",
          "min_stay_type",
          "property_type_group",
          "group_ids"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique property identifier.",
            "examples": [
              "716305c4-561a-4561-a187-7f5b8aeb5920"
            ]
          },
          "title": {
            "type": "string",
            "description": "Property title, as shown in the system.",
            "examples": [
              "Demo Hotel"
            ]
          },
          "is_owner": {
            "type": "boolean",
            "description": "Whether the current user owns the property.",
            "examples": [
              true
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Default currency of the property.",
            "examples": [
              "USD"
            ]
          },
          "min_stay_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Properties.MinStayType"
              }
            ],
            "description": "Simplified Min Stay restriction handling for the property."
          },
          "property_type_group": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Group the property type belongs to, or null when the property has no type.",
            "examples": [
              "hotel"
            ]
          },
          "group_ids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "UUIDs of the groups the property belongs to."
          }
        },
        "description": "Attributes of a property `/options` item."
      },
      "Properties.PropertyRelationships": {
        "type": "object",
        "required": [
          "users",
          "groups",
          "facilities",
          "hotel_policies",
          "cancellation_policies",
          "tax_sets"
        ],
        "properties": {
          "users": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Authentication.EmbeddedUser"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Users with access to the property."
          },
          "groups": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "type",
                    "id",
                    "attributes"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "group"
                      ]
                    },
                    "id": {
                      "$ref": "#/components/schemas/Common.Scalars.id"
                    },
                    "attributes": {
                      "$ref": "#/components/schemas/Common.JsonApi.OptionAttributes"
                    }
                  },
                  "description": "A lightweight JSON:API resource returned by `/options` endpoints — id + title only, no relationships or pagination."
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Groups the property belongs to."
          },
          "facilities": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Facilities.FacilityResource"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Facilities associated with the property."
          },
          "hotel_policies": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/HotelPolicies.EmbeddedHotelPolicy"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Hotel policies associated with the property."
          },
          "cancellation_policies": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "type",
                    "id",
                    "attributes"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "cancellation_policy"
                      ]
                    },
                    "id": {
                      "$ref": "#/components/schemas/Common.Scalars.id"
                    },
                    "attributes": {
                      "$ref": "#/components/schemas/Common.JsonApi.OptionAttributes"
                    }
                  },
                  "description": "A lightweight JSON:API resource returned by `/options` endpoints — id + title only, no relationships or pagination."
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Cancellation policies associated with the property."
          },
          "tax_sets": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "type",
                    "id",
                    "attributes"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "enum": [
                        "tax_set"
                      ]
                    },
                    "id": {
                      "$ref": "#/components/schemas/Common.Scalars.id"
                    },
                    "attributes": {
                      "$ref": "#/components/schemas/Common.JsonApi.OptionAttributes"
                    }
                  },
                  "description": "A lightweight JSON:API resource returned by `/options` endpoints — id + title only, no relationships or pagination."
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Tax sets associated with the property."
          }
        },
        "description": "Relationships of a single property: the list blocks plus the facilities, policies and tax sets of the property."
      },
      "Properties.PropertyResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "property"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Properties.Property"
          },
          "relationships": {
            "$ref": "#/components/schemas/Properties.PropertyRelationships"
          }
        },
        "description": "A property as returned by the single-property endpoints."
      },
      "Properties.PropertySettings": {
        "type": "object",
        "required": [
          "allow_availability_autoupdate_on_confirmation",
          "allow_availability_autoupdate_on_modification",
          "allow_availability_autoupdate_on_cancellation",
          "min_stay_type",
          "state_length",
          "cut_off_time",
          "cut_off_days",
          "max_day_advance",
          "min_price",
          "max_price"
        ],
        "properties": {
          "allow_availability_autoupdate_on_confirmation": {
            "type": "boolean",
            "description": "Decrease availability on new bookings. Effectively read-only — cannot be set to `false`. Always equal to `true`."
          },
          "allow_availability_autoupdate_on_modification": {
            "type": "boolean",
            "description": "Increase/decrease availability on booking modification. Default is `false`, which is the recommended setting."
          },
          "allow_availability_autoupdate_on_cancellation": {
            "type": "boolean",
            "description": "Increase availability on booking cancellation. Default is `false`, which is the recommended setting."
          },
          "min_stay_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Properties.MinStayType"
              }
            ],
            "description": "Simplified Min Stay restriction handling for the property."
          },
          "state_length": {
            "type": "integer",
            "format": "int32",
            "minimum": 100,
            "maximum": 730,
            "description": "Length of the inventory table in days (100-730). Default is 500.",
            "examples": [
              500
            ]
          },
          "cut_off_time": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cut-off time in 30-minute steps, e.g. `\"00:00:00\"`, or null when no cut-off is set. At this time each day, availability is closed for today plus `cut_off_days`.",
            "examples": [
              "00:00:00"
            ]
          },
          "cut_off_days": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "minimum": 0,
            "maximum": 30,
            "description": "Number of days closed by the cut-off task (0-30), or null when no cut-off is set.",
            "examples": [
              0
            ]
          },
          "max_day_advance": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Max number of days open for sale, or null. Applying this overwrites availability with 0 beyond the window; the overwritten values are only recoverable through a full sync.",
            "examples": [
              365
            ]
          },
          "min_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Minimum price per property, or null. Prices below it are raised to it.",
            "examples": [
              "100.00"
            ]
          },
          "max_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum price per property, or null. Prices above it are lowered to it.",
            "examples": [
              "300.00"
            ]
          }
        },
        "description": "Property-level settings as returned in responses: every setting is present."
      },
      "Properties.PropertySettingsWrite": {
        "type": "object",
        "properties": {
          "allow_availability_autoupdate_on_confirmation": {
            "type": "boolean",
            "description": "Decrease availability on new bookings. Effectively read-only — cannot be set to `false`. Always equal to `true`."
          },
          "allow_availability_autoupdate_on_modification": {
            "type": "boolean",
            "description": "Increase/decrease availability on booking modification. Default is `false`, which is the recommended setting."
          },
          "allow_availability_autoupdate_on_cancellation": {
            "type": "boolean",
            "description": "Increase availability on booking cancellation. Default is `false`, which is the recommended setting."
          },
          "min_stay_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Properties.MinStayType"
              }
            ],
            "description": "Simplified Min Stay restriction handling for the property."
          },
          "state_length": {
            "type": "integer",
            "format": "int32",
            "minimum": 100,
            "maximum": 730,
            "description": "Length of the inventory table in days (100-730). Default is 500.",
            "examples": [
              500
            ]
          },
          "cut_off_time": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cut-off time in 30-minute steps, e.g. `\"00:00:00\"`, or null when no cut-off is set. At this time each day, availability is closed for today plus `cut_off_days`.",
            "examples": [
              "00:00:00"
            ]
          },
          "cut_off_days": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "minimum": 0,
            "maximum": 30,
            "description": "Number of days closed by the cut-off task (0-30), or null when no cut-off is set.",
            "examples": [
              0
            ]
          },
          "max_day_advance": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Max number of days open for sale, or null. Applying this overwrites availability with 0 beyond the window; the overwritten values are only recoverable through a full sync.",
            "examples": [
              365
            ]
          },
          "min_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Minimum price per property: a decimal string like `\"100.00\"`, an integer in the currency's minor units (`10000` for 100.00 USD), or null. Prices below it are raised to it.",
            "examples": [
              "100.00"
            ]
          },
          "max_price": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum price per property: a decimal string like `\"300.00\"`, an integer in the currency's minor units (`30000` for 300.00 USD), or null. Prices above it are lowered to it.",
            "examples": [
              "300.00"
            ]
          }
        },
        "description": "Property-level settings accepted on create and update."
      },
      "Properties.PropertyType": {
        "type": "string",
        "enum": [
          "apart_hotel",
          "apartment",
          "boat",
          "camping",
          "capsule_hotel",
          "chalet",
          "country_house",
          "farm_stay",
          "guest_house",
          "holiday_home",
          "holiday_park",
          "homestay",
          "hostel",
          "hotel",
          "inn",
          "lodge",
          "motel",
          "resort",
          "riad",
          "ryokan",
          "tent",
          "villa"
        ],
        "description": "Type of property. Affects billing — set `hotel` for hotels or `apartment` for vacation rentals."
      },
      "Properties.PropertyUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Property title, as shown in the system.",
            "examples": [
              "Demo Hotel"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Default currency for nested entities, and the property's default currency for connected third-party services.",
            "examples": [
              "GBP"
            ]
          },
          "email": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              },
              {
                "type": "null"
              }
            ],
            "description": "Contact email. Passed to connected third-party services as the property's contact email. Optional at setup, required before connecting a 3rd-party service."
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 32,
            "description": "Contact phone. Digits, spaces, brackets and special characters; max 32 chars. Passed to connected third-party services as the property's contact phone. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "+44 99 9999 9999"
            ]
          },
          "zip_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 32,
            "description": "ZIP/postal code (max 32 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "XXX XXX"
            ]
          },
          "country": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.country"
              },
              {
                "type": "null"
              }
            ],
            "description": "Country of the property. ISO 3166-1 alpha-2 country code. Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "GB"
            ]
          },
          "state": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "State/region (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "Wales"
            ]
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "City (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "Cardiff"
            ]
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 255,
            "description": "Street address (max 255 chars). Part of the contact address passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "123 High Street"
            ]
          },
          "longitude": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 12,
            "description": "Longitude as a decimal string in the range −180..180 (max 7 decimals). Derived from the address when the property is saved without one. Part of the property coordinates passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "-0.2416781"
            ]
          },
          "latitude": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "maxLength": 11,
            "description": "Latitude as a decimal string in the range −90..90 (max 7 decimals). Derived from the address when the property is saved without one. Part of the property coordinates passed to connected third-party services. Optional at setup, required before connecting a 3rd-party service.",
            "examples": [
              "51.5285582"
            ]
          },
          "timezone": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.timezone"
              },
              {
                "type": "null"
              }
            ],
            "description": "Time zone of the property, or null when it is not set. Sending `null` clears it.\n\nTime zone name from the IANA Time Zone Database (the \"tz database\"), published at\nhttps://www.iana.org/time-zones — background at\nhttps://en.wikipedia.org/wiki/Tz_database. See the `/timezones` endpoint for the\nvalues this API accepts.",
            "examples": [
              "Europe/London"
            ]
          },
          "property_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Properties.PropertyType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Type of the property, or null when it is not set. Sending `null` clears it.\n\n**Set this value — it affects billing. Use `hotel` for a hotel and `apartment`\nfor a vacation rental.**"
          },
          "logo_url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL to the property logo; copied into Channex media storage.",
            "examples": [
              "https://example.com/logo.png"
            ]
          },
          "website": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ],
            "description": "URL to the property website.",
            "examples": [
              "https://example.com"
            ]
          },
          "hotel_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's hotel policy, or null. Sending `null` clears it."
          },
          "default_cancellation_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's default cancellation policy, or null."
          },
          "default_tax_set_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property's default tax set, or null."
          },
          "location_precision": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Location precision, or null."
          },
          "min_stay_type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Properties.MinStayType"
              }
            ],
            "description": "Simplified Min Stay restriction handling for the property. Mirrors `settings.min_stay_type`: writing either attribute updates both.",
            "deprecated": true
          },
          "facilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Property Facility IDs to associate. See the Property Facilities endpoint for the available identifiers. In responses, facilities appear under relationships."
          },
          "settings": {
            "$ref": "#/components/schemas/Properties.PropertySettingsWrite"
          },
          "content": {
            "$ref": "#/components/schemas/Properties.PropertyContentWrite"
          }
        },
        "description": "Property attributes accepted when updating a property. Every attribute is optional; attributes absent from the request are left unchanged."
      },
      "Properties.PropertyUpdateRequest": {
        "type": "object",
        "required": [
          "property"
        ],
        "properties": {
          "property": {
            "$ref": "#/components/schemas/Properties.PropertyUpdate"
          }
        },
        "description": "Request body accepted when updating a property."
      },
      "PropertyUsers.EmbeddedPropertyRef": {
        "type": "object",
        "required": [
          "id",
          "type"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "property"
            ]
          }
        },
        "description": "The property an access belongs to, as it appears among a property user's relationships."
      },
      "PropertyUsers.PropertyUser": {
        "type": "object",
        "required": [
          "id",
          "user_id",
          "property_id",
          "role",
          "overrides"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique property user identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "776533f2-c10e-49d8-bddc-14b3e27c2a00"
            ]
          },
          "user_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the user the access is granted to.",
            "examples": [
              "c9cfa184-5095-4ef2-bbe2-e723ffb49184"
            ]
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the access is granted to.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/PropertyUsers.PropertyUserRole"
          },
          "overrides": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Access policy overrides applied to this access on top of the role, or null when the role applies unchanged."
          }
        },
        "description": "A user's access to a property, as returned in responses: every attribute is present."
      },
      "PropertyUsers.PropertyUserCreate": {
        "type": "object",
        "required": [
          "property_id",
          "role",
          "user_email"
        ],
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the access is granted to.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/PropertyUsers.PropertyUserRole"
          },
          "overrides": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Access policy overrides applied to this access on top of the role, or null when the role applies unchanged."
          },
          "user_email": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              }
            ],
            "description": "Email address of the user to invite. A user without a Channex account gets one,\nand an onboarding email.",
            "examples": [
              "other_user@channex.io"
            ]
          }
        },
        "description": "Attributes accepted when inviting a user to a property."
      },
      "PropertyUsers.PropertyUserCreateRequest": {
        "type": "object",
        "required": [
          "invite"
        ],
        "properties": {
          "invite": {
            "$ref": "#/components/schemas/PropertyUsers.PropertyUserCreate"
          }
        },
        "description": "Request body accepted when inviting a user to a property."
      },
      "PropertyUsers.PropertyUserRelationships": {
        "type": "object",
        "required": [
          "property",
          "user"
        ],
        "properties": {
          "property": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/PropertyUsers.EmbeddedPropertyRef"
              }
            },
            "required": [
              "data"
            ],
            "description": "The property the access is granted to."
          },
          "user": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/Authentication.EmbeddedUser"
              }
            },
            "required": [
              "data"
            ],
            "description": "The user the access is granted to."
          }
        },
        "description": "Relationships of a property user resource: the property the access is for and the user it is granted to."
      },
      "PropertyUsers.PropertyUserResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "property_user"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/PropertyUsers.PropertyUser"
          },
          "relationships": {
            "$ref": "#/components/schemas/PropertyUsers.PropertyUserRelationships"
          }
        },
        "description": "A property user resource: the access attributes plus the property and user it links."
      },
      "PropertyUsers.PropertyUserRole": {
        "type": "string",
        "enum": [
          "owner",
          "user"
        ],
        "description": "Role granted to a user for a property."
      },
      "PropertyUsers.PropertyUserUpdate": {
        "type": "object",
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the access is granted to.",
            "examples": [
              "52397a6e-c330-44f4-a293-47042d3a3607"
            ]
          },
          "role": {
            "$ref": "#/components/schemas/PropertyUsers.PropertyUserRole"
          },
          "overrides": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Access policy overrides applied to this access on top of the role, or null when the role applies unchanged."
          },
          "user_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the user to grant the access to.",
            "examples": [
              "c9cfa184-5095-4ef2-bbe2-e723ffb49184"
            ]
          }
        },
        "description": "Attributes accepted when updating a property user. Every attribute is optional; attributes absent from the request are left unchanged."
      },
      "PropertyUsers.PropertyUserUpdateRequest": {
        "type": "object",
        "required": [
          "property_user"
        ],
        "properties": {
          "property_user": {
            "$ref": "#/components/schemas/PropertyUsers.PropertyUserUpdate"
          }
        },
        "description": "Request body accepted when updating a property user."
      },
      "RatePlans.AutoRateMode": {
        "type": "string",
        "enum": [
          "$",
          "%"
        ],
        "description": "How an automatic rate adjustment is expressed: `$` for an amount, `%` for a percent."
      },
      "RatePlans.AutoRateSettings": {
        "type": "object",
        "required": [
          "increase_mode",
          "decrease_mode",
          "increase_value",
          "decrease_value"
        ],
        "properties": {
          "increase_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.AutoRateMode"
              }
            ],
            "description": "How an increase is expressed."
          },
          "decrease_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.AutoRateMode"
              }
            ],
            "description": "How a decrease is expressed."
          },
          "increase_value": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Amount or percent to increase by, as a decimal string.",
            "examples": [
              "10.00"
            ]
          },
          "decrease_value": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Amount or percent to decrease by, as a decimal string.",
            "examples": [
              "5.00"
            ]
          }
        },
        "description": "How rate options are derived from the primary occupancy option when `rate_mode` is `auto`, as returned in responses."
      },
      "RatePlans.AutoRateSettingsWrite": {
        "type": "object",
        "required": [
          "increase_mode",
          "decrease_mode",
          "increase_value",
          "decrease_value"
        ],
        "properties": {
          "increase_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.AutoRateMode"
              }
            ],
            "description": "How an increase is expressed."
          },
          "decrease_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.AutoRateMode"
              }
            ],
            "description": "How a decrease is expressed."
          },
          "increase_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Amount or percent to increase by: a decimal string like `\"10.00\"`, or an integer in hundredths (`1000` → `\"10.00\"`).",
            "examples": [
              "10.00"
            ]
          },
          "decrease_value": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Amount or percent to decrease by: a decimal string like `\"5.00\"`, or an integer in hundredths (`500` → `\"5.00\"`).",
            "examples": [
              "5.00"
            ]
          }
        },
        "description": "How rate options are derived from the primary occupancy option when `rate_mode` is `auto`, as accepted in requests."
      },
      "RatePlans.DerivedOption": {
        "type": "object",
        "properties": {
          "rate": {
            "type": "array",
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "string",
                  "enum": [
                    "increase_by_amount",
                    "increase_by_percent",
                    "decrease_by_amount",
                    "decrease_by_percent"
                  ],
                  "description": "A value-modification rule, applied to the original value with the step's argument.\n`increase_by_amount` — add the amount.\n`increase_by_percent` — increase by the percent.\n`decrease_by_amount` — subtract the amount.\n`decrease_by_percent` — decrease by the percent."
                },
                {
                  "type": "string"
                }
              ]
            },
            "description": "Modification rules for the rate, applied to the original value in order; empty to derive the rate unchanged. Each rule is `[operation, value]` with the value as a decimal string; the operations are `increase_by_amount`, `increase_by_percent`, `decrease_by_amount` and `decrease_by_percent`.",
            "examples": [
              [
                [
                  "increase_by_percent",
                  "5.00"
                ],
                [
                  "increase_by_amount",
                  "12.00"
                ]
              ]
            ]
          },
          "min_stay_arrival": {
            "type": "array",
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "string",
                  "enum": [
                    "set"
                  ],
                  "description": "The rule of `min_stay_arrival`, `min_stay_through` and `stop_sell`: `set` — the restriction takes the rule's value."
                },
                {
                  "type": "integer",
                  "format": "int32",
                  "minimum": 1
                }
              ]
            },
            "maxItems": 1,
            "description": "Rule for the minimum stay counted on arrival: at most one, `[\"set\", <positive integer>]`.",
            "examples": [
              [
                [
                  "set",
                  2
                ]
              ]
            ]
          },
          "min_stay_through": {
            "type": "array",
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "string",
                  "enum": [
                    "set"
                  ],
                  "description": "The rule of `min_stay_arrival`, `min_stay_through` and `stop_sell`: `set` — the restriction takes the rule's value."
                },
                {
                  "type": "integer",
                  "format": "int32",
                  "minimum": 1
                }
              ]
            },
            "maxItems": 1,
            "description": "Rule for the minimum stay counted through the stay: at most one, `[\"set\", <positive integer>]`.",
            "examples": [
              [
                [
                  "set",
                  3
                ]
              ]
            ]
          },
          "stop_sell": {
            "type": "array",
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "string",
                  "enum": [
                    "set"
                  ],
                  "description": "The rule of `min_stay_arrival`, `min_stay_through` and `stop_sell`: `set` — the restriction takes the rule's value."
                },
                {
                  "type": "boolean"
                }
              ]
            },
            "maxItems": 1,
            "description": "Rule for the stop sell flag: at most one, `[\"set\", <boolean>]`.",
            "examples": [
              [
                [
                  "set",
                  true
                ]
              ]
            ]
          }
        },
        "description": "Rules deriving values from the Parent Rate Plan or from the primary occupancy option, keyed by the restriction they modify.\n\nThe object is keyed by the restriction a rule list modifies — `rate`, `min_stay_arrival`, `min_stay_through` or `stop_sell` — and each key holds a list of `[operation, value]` rules. `null` or `[]` in place of the object means no derived option. A key outside these four is refused unless its value is empty.\n\n`rate` takes any number of rules, applied to the original value in order, from left to right:\n\n- `increase_by_amount` — add the amount\n- `increase_by_percent` — increase by the percent\n- `decrease_by_amount` — subtract the amount\n- `decrease_by_percent` — decrease by the percent\n\nThe value is the amount or the percent as a string, for example `\"10\"` or `\"5.00\"`; a decimal comma is accepted. It must not be negative. `decrease_by_percent` must stay below 100 once rounded to two decimals — `\"99.99\"` is accepted, `\"99.995\"` is not; `increase_by_percent` has no upper limit. For an original rate of 100.00:\n\n```json\n{\"rate\": [[\"increase_by_percent\", \"5.00\"], [\"increase_by_amount\", \"12.00\"]]}\n```\n\n100.00 + 5% = 105.00, then 105.00 + 12.00 = 117.00. An empty list, `{\"rate\": []}`, derives the rate unchanged.\n\n`min_stay_arrival` and `min_stay_through` take one rule at most, `[\"set\", <positive integer>]`, and `stop_sell` one rule at most, `[\"set\", <boolean>]`: the restriction takes the given value instead of the original one."
      },
      "RatePlans.MealType": {
        "type": "string",
        "enum": [
          "none",
          "all_inclusive",
          "breakfast",
          "lunch",
          "dinner",
          "american",
          "bed_and_breakfast",
          "buffet_breakfast",
          "carribean_breakfast",
          "continental_breakfast",
          "english_breakfast",
          "european_plan",
          "family_plan",
          "full_board",
          "full_breakfast",
          "half_board",
          "room_only",
          "self_catering",
          "bermuda",
          "dinner_bed_and_breakfast_plan",
          "family_american",
          "breakfast_and_lunch",
          "lunch_and_dinner"
        ],
        "description": "Meal plan included in the rate plan."
      },
      "RatePlans.OccupancyOption": {
        "type": "object",
        "required": [
          "id",
          "occupancy",
          "is_primary",
          "inherit_rate",
          "inherit_closed_to_arrival",
          "inherit_closed_to_departure",
          "inherit_stop_sell",
          "inherit_min_stay_arrival",
          "inherit_min_stay_through",
          "inherit_max_stay",
          "inherit_max_availability",
          "inherit_availability_offset",
          "derived_option",
          "rate_category_id",
          "rate"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique occupancy option identifier."
          },
          "occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Count of guests allowed for this occupancy option. At most the Room Type's `occ_adults`; each occupancy appears once, and `2` and `\"2\"` count as the same occupancy.",
            "examples": [
              3
            ]
          },
          "is_primary": {
            "type": "boolean",
            "description": "Marks the main occupancy option — the base point for derived calculations. Exactly one option of a rate plan is primary."
          },
          "inherit_rate": {
            "type": "boolean",
            "description": "Whether the option's `rate` is derived from the Parent Rate Plan."
          },
          "inherit_closed_to_arrival": {
            "type": "boolean",
            "description": "Whether the option's `closed_to_arrival` is derived from the Parent Rate Plan."
          },
          "inherit_closed_to_departure": {
            "type": "boolean",
            "description": "Whether the option's `closed_to_departure` is derived from the Parent Rate Plan."
          },
          "inherit_stop_sell": {
            "type": "boolean",
            "description": "Whether the option's `stop_sell` is derived from the Parent Rate Plan."
          },
          "inherit_min_stay_arrival": {
            "type": "boolean",
            "description": "Whether the option's `min_stay_arrival` is derived from the Parent Rate Plan."
          },
          "inherit_min_stay_through": {
            "type": "boolean",
            "description": "Whether the option's `min_stay_through` is derived from the Parent Rate Plan."
          },
          "inherit_max_stay": {
            "type": "boolean",
            "description": "Whether the option's `max_stay` is derived from the Parent Rate Plan."
          },
          "inherit_max_availability": {
            "type": "boolean",
            "description": "Whether the option's `max_availability` is derived from the Parent Rate Plan."
          },
          "inherit_availability_offset": {
            "type": "boolean",
            "description": "Whether the option's `availability_offset` is derived from the Parent Rate Plan."
          },
          "derived_option": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.DerivedOption"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rules deriving this option's values from the Parent Rate Plan or the primary occupancy option, keyed by the restriction they modify. `null` when the option is not derived; `{\"rate\": []}`, the default once a parent is set, derives the rate unchanged. Rate values are returned as decimal strings in the currency of the rate plan, for example `\"10.00\"`.\n\nThe object is keyed by the restriction a rule list modifies — `rate`, `min_stay_arrival`, `min_stay_through` or `stop_sell` — and each key holds a list of `[operation, value]` rules. `null` or `[]` in place of the object means no derived option. A key outside these four is refused unless its value is empty.\n\n`rate` takes any number of rules, applied to the original value in order, from left to right:\n\n- `increase_by_amount` — add the amount\n- `increase_by_percent` — increase by the percent\n- `decrease_by_amount` — subtract the amount\n- `decrease_by_percent` — decrease by the percent\n\nThe value is the amount or the percent as a string, for example `\"10\"` or `\"5.00\"`; a decimal comma is accepted. It must not be negative. `decrease_by_percent` must stay below 100 once rounded to two decimals — `\"99.99\"` is accepted, `\"99.995\"` is not; `increase_by_percent` has no upper limit. For an original rate of 100.00:\n\n```json\n{\"rate\": [[\"increase_by_percent\", \"5.00\"], [\"increase_by_amount\", \"12.00\"]]}\n```\n\n100.00 + 5% = 105.00, then 105.00 + 12.00 = 117.00. An empty list, `{\"rate\": []}`, derives the rate unchanged.\n\n`min_stay_arrival` and `min_stay_through` take one rule at most, `[\"set\", <positive integer>]`, and `stop_sell` one rule at most, `[\"set\", <boolean>]`: the restriction takes the given value instead of the original one."
          },
          "rate_category_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the associated rate category, or null."
          },
          "rate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Default rate applied to each date of a new rate plan and to each future date newly opened in state.",
            "examples": [
              "100.00"
            ]
          }
        },
        "description": "An occupancy option — the price for a specific count of guests — as returned in responses."
      },
      "RatePlans.OccupancyOptionWrite": {
        "type": "object",
        "required": [
          "occupancy",
          "is_primary"
        ],
        "properties": {
          "occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Count of guests allowed for this occupancy option. At most the Room Type's `occ_adults`; each occupancy appears once, and `2` and `\"2\"` count as the same occupancy.",
            "examples": [
              3
            ]
          },
          "is_primary": {
            "type": "boolean",
            "description": "Marks the main occupancy option — the base point for derived calculations. Exactly one option of a rate plan is primary."
          },
          "derived_option": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.DerivedOption"
              },
              {
                "type": "null"
              }
            ],
            "description": "Rules deriving this option's values from the Parent Rate Plan or the primary occupancy option, keyed by the restriction they modify. Defaults to `{\"rate\": []}`, derive the rate unchanged, when the rate plan has a parent.\n\nThe object is keyed by the restriction a rule list modifies — `rate`, `min_stay_arrival`, `min_stay_through` or `stop_sell` — and each key holds a list of `[operation, value]` rules. `null` or `[]` in place of the object means no derived option. A key outside these four is refused unless its value is empty.\n\n`rate` takes any number of rules, applied to the original value in order, from left to right:\n\n- `increase_by_amount` — add the amount\n- `increase_by_percent` — increase by the percent\n- `decrease_by_amount` — subtract the amount\n- `decrease_by_percent` — decrease by the percent\n\nThe value is the amount or the percent as a string, for example `\"10\"` or `\"5.00\"`; a decimal comma is accepted. It must not be negative. `decrease_by_percent` must stay below 100 once rounded to two decimals — `\"99.99\"` is accepted, `\"99.995\"` is not; `increase_by_percent` has no upper limit. For an original rate of 100.00:\n\n```json\n{\"rate\": [[\"increase_by_percent\", \"5.00\"], [\"increase_by_amount\", \"12.00\"]]}\n```\n\n100.00 + 5% = 105.00, then 105.00 + 12.00 = 117.00. An empty list, `{\"rate\": []}`, derives the rate unchanged.\n\n`min_stay_arrival` and `min_stay_through` take one rule at most, `[\"set\", <positive integer>]`, and `stop_sell` one rule at most, `[\"set\", <boolean>]`: the restriction takes the given value instead of the original one.\n\nAn invalid derived option is refused with `422` `validation_error`. Each problem is reported under its own key in `details`, and one request can return several keys:\n\n```\n<prefix>.<restriction>[.<rule index>[.<element index>]]\n```\n\n`<restriction>` is the key as sent, for example `rate`. `<rule index>` is the 0-based position of the rule in the list as sent; `null` and `[]` entries are skipped but keep their position. `<element index>` is `0` for the operation and `1` for the value. When the operation is wrong, the value of that rule is not checked.\n\n| Condition | Key | Message |\n| --- | --- | --- |\n| A key outside the four restrictions, with a non-empty value | `<prefix>.ratee` | `unknown restriction` |\n| The value of a key is not a list | `<prefix>.rate` | `must be a list` |\n| An entry of the list is not a list | `<prefix>.rate` | `must be a list of [operation, value] rules` |\n| More than one rule for `min_stay_arrival`, `min_stay_through` or `stop_sell` | `<prefix>.min_stay_through` | `must hold at most one rule` |\n| A rule is not a two-item list | `<prefix>.rate.0` | `must be an [operation, value] pair` |\n| An unknown operation, or one the restriction does not take | `<prefix>.rate.0.0` | `incorrect derived_option rule` |\n| A `rate` value that is not a number | `<prefix>.rate.0.1` | `amount must be a number` |\n| A negative `rate` value | `<prefix>.rate.0.1` | `amount must not be negative` |\n| A `decrease_by_percent` value of 100 or more | `<prefix>.rate.0.1` | `percent must be less than 100` |\n| A `min_stay_arrival` or `min_stay_through` value that is not a positive integer | `<prefix>.min_stay_arrival.0.1` | `must be a positive integer` |\n| A `stop_sell` value that is not a boolean | `<prefix>.stop_sell.0.1` | `must be a boolean` |\n\nFor the options of a rate plan, `<prefix>` is `options.derived_option`, without the position of the option: `options.derived_option.rate.0.1`."
          },
          "rate": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Default rate applied to each date of a new rate plan and to each future date newly opened in state: a decimal string like `\"100.00\"`, or an integer in the currency's minor units. Defaults to `\"0.00\"`. A string that is not a number (for example `\"abc\"`) is refused with `422` (`details.rate: [\"is invalid\"]`); a negative value with `422` (`details.rate: [\"must be greater than or equal to 0\"]`).",
            "examples": [
              "100.00"
            ]
          }
        },
        "description": "An occupancy option accepted on create and update. A `per_room` rate plan takes one option for the maximum occupancy; a `per_person` rate plan takes an option per possible count of adult guests."
      },
      "RatePlans.RateMode": {
        "type": "string",
        "enum": [
          "manual",
          "derived",
          "cascade",
          "auto"
        ],
        "description": "How the rate of the rate plan is calculated.\n`manual` — the price is the one set in `options[].rate`.\n`derived` — the price of the primary occupancy option is derived from the Parent Rate Plan.\n`cascade` — the price of every occupancy option is derived from the Parent Rate Plan; on create, an option is added for each occupancy from 1 to the Room Type's `occ_adults` that the request does not name, each derived from the parent's option of the same occupancy.\n`auto` — the price is calculated from the primary occupancy option's price and `auto_rate_settings`."
      },
      "RatePlans.RatePlan": {
        "type": "object",
        "required": [
          "id",
          "title",
          "sell_mode",
          "rate_mode",
          "currency",
          "meal_type",
          "tax_set_id",
          "cancellation_policy_id",
          "ui_read_only",
          "meta",
          "inherit_rate",
          "inherit_closed_to_arrival",
          "inherit_closed_to_departure",
          "inherit_stop_sell",
          "inherit_min_stay_arrival",
          "inherit_min_stay_through",
          "inherit_max_stay",
          "inherit_max_availability",
          "inherit_availability_offset",
          "options",
          "auto_rate_settings",
          "children_fee",
          "infant_fee",
          "max_stay",
          "min_stay_arrival",
          "min_stay_through",
          "closed_to_arrival",
          "closed_to_departure",
          "stop_sell"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique rate plan identifier.",
            "examples": [
              "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2"
            ]
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Rate plan title, unique within a Room Type (case-sensitive). A title that is blank after trimming whitespace (for example `\"   \"`) is refused with `422` (`details.title: [\"can't be blank\"]`).",
            "examples": [
              "Best Available Rate"
            ]
          },
          "sell_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.SellMode"
              }
            ],
            "description": "How the rate plan is sold. Defaults to `per_room`. Cannot be changed after creation: on update a value other than the stored one is refused with `422` (`details.sell_mode: [\"can't be changed\"]`); the stored value is accepted."
          },
          "rate_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.RateMode"
              }
            ],
            "description": "How the rate is calculated. Defaults to `manual`."
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Rate plan currency, an ISO 4217 code. Defaults to the currency of the associated Property; a Property can have rate plans in different currencies. On create, an unsupported code is refused with `422` (`details.currency: [\"is invalid\"]`). Cannot be changed after creation: a value sent on update is ignored."
          },
          "meal_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.MealType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Meal plan included in the rate plan. `none` by default; null once cleared."
          },
          "tax_set_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Tax Set applied to the rate plan, or null. Defaults to the Property's default Tax Set. The tax set also appears under relationships."
          },
          "cancellation_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Cancellation Policy applied to the rate plan, or null."
          },
          "ui_read_only": {
            "type": "boolean",
            "description": "Whether the rate plan is shown as read-only in the Channex interface."
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged."
          },
          "inherit_rate": {
            "type": "boolean",
            "description": "Whether `rate` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_closed_to_arrival": {
            "type": "boolean",
            "description": "Whether `closed_to_arrival` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_closed_to_departure": {
            "type": "boolean",
            "description": "Whether `closed_to_departure` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_stop_sell": {
            "type": "boolean",
            "description": "Whether `stop_sell` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_min_stay_arrival": {
            "type": "boolean",
            "description": "Whether `min_stay_arrival` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_min_stay_through": {
            "type": "boolean",
            "description": "Whether `min_stay_through` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_max_stay": {
            "type": "boolean",
            "description": "Whether `max_stay` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_max_availability": {
            "type": "boolean",
            "description": "Whether `max_availability` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_availability_offset": {
            "type": "boolean",
            "description": "Whether `availability_offset` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatePlans.OccupancyOption"
            },
            "description": "Occupancy options — prices for different counts of guests."
          },
          "auto_rate_settings": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.AutoRateSettings"
              },
              {
                "type": "null"
              }
            ],
            "description": "How rate options are derived from the primary occupancy option. Filled with zero-valued amount settings when `rate_mode` is `auto` and nothing is sent; null otherwise."
          },
          "children_fee": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Additional fee added to the normal price for a Children guest (per Hotel Age Policy).",
            "examples": [
              "0.00"
            ]
          },
          "infant_fee": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Additional fee added to the normal price for an Infant guest (per Hotel Age Policy).",
            "examples": [
              "0.00"
            ]
          },
          "max_stay": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
            },
            "minItems": 7,
            "maxItems": 7,
            "description": "Default Max Stay restriction per weekday (7 values, Monday first). `0` means no limit."
          },
          "min_stay_arrival": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.positiveInt"
            },
            "minItems": 7,
            "maxItems": 7,
            "description": "Default Min Stay Arrival restriction per weekday (7 values, Monday first)."
          },
          "min_stay_through": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.positiveInt"
            },
            "minItems": 7,
            "maxItems": 7,
            "description": "Default Min Stay Through restriction per weekday (7 values, Monday first)."
          },
          "closed_to_arrival": {
            "type": "array",
            "items": {
              "type": "boolean"
            },
            "minItems": 7,
            "maxItems": 7,
            "description": "Default Closed To Arrival restriction per weekday (7 values, Monday first)."
          },
          "closed_to_departure": {
            "type": "array",
            "items": {
              "type": "boolean"
            },
            "minItems": 7,
            "maxItems": 7,
            "description": "Default Closed To Departure restriction per weekday (7 values, Monday first)."
          },
          "stop_sell": {
            "type": "array",
            "items": {
              "type": "boolean"
            },
            "minItems": 7,
            "maxItems": 7,
            "description": "Default Stop Sell restriction per weekday (7 values, Monday first)."
          }
        },
        "description": "A rate plan — a pricing plan of how to sell a Room Type, with prices and restriction defaults — as returned in responses: every attribute is present."
      },
      "RatePlans.RatePlanCreate": {
        "type": "object",
        "required": [
          "title",
          "property_id",
          "room_type_id",
          "options"
        ],
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Rate plan title, unique within a Room Type (case-sensitive). A title that is blank after trimming whitespace (for example `\"   \"`) is refused with `422` (`details.title: [\"can't be blank\"]`).",
            "examples": [
              "Best Available Rate"
            ]
          },
          "sell_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.SellMode"
              }
            ],
            "description": "How the rate plan is sold. Defaults to `per_room`. Cannot be changed after creation: on update a value other than the stored one is refused with `422` (`details.sell_mode: [\"can't be changed\"]`); the stored value is accepted."
          },
          "rate_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.RateMode"
              }
            ],
            "description": "How the rate is calculated. Defaults to `manual`."
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Rate plan currency, an ISO 4217 code. Defaults to the currency of the associated Property; a Property can have rate plans in different currencies. On create, an unsupported code is refused with `422` (`details.currency: [\"is invalid\"]`). Cannot be changed after creation: a value sent on update is ignored."
          },
          "meal_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.MealType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Meal plan included in the rate plan. `none` by default; null once cleared."
          },
          "tax_set_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Tax Set applied to the rate plan, or null. Defaults to the Property's default Tax Set. The tax set also appears under relationships."
          },
          "cancellation_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Cancellation Policy applied to the rate plan, or null."
          },
          "ui_read_only": {
            "type": "boolean",
            "description": "Whether the rate plan is shown as read-only in the Channex interface."
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged."
          },
          "inherit_rate": {
            "type": "boolean",
            "description": "Whether `rate` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_closed_to_arrival": {
            "type": "boolean",
            "description": "Whether `closed_to_arrival` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_closed_to_departure": {
            "type": "boolean",
            "description": "Whether `closed_to_departure` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_stop_sell": {
            "type": "boolean",
            "description": "Whether `stop_sell` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_min_stay_arrival": {
            "type": "boolean",
            "description": "Whether `min_stay_arrival` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_min_stay_through": {
            "type": "boolean",
            "description": "Whether `min_stay_through` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_max_stay": {
            "type": "boolean",
            "description": "Whether `max_stay` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_max_availability": {
            "type": "boolean",
            "description": "Whether `max_availability` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_availability_offset": {
            "type": "boolean",
            "description": "Whether `availability_offset` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property to associate with the rate plan. Cannot be changed after creation."
          },
          "room_type_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Room Type the rate plan sells. Must belong to the Property. Cannot be changed after creation."
          },
          "parent_rate_plan_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Rate Plan to derive this rate plan from. Must be a rate plan of the same Property; it may sell another Room Type. When set on create without `rate_mode`, the rate plan is created with `rate_mode: derived`. `null` detaches the parent."
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatePlans.OccupancyOptionWrite"
            },
            "description": "Occupancy options. A `per_room` rate plan takes one option for the maximum occupancy; a `per_person` rate plan takes an option per possible count of adult guests. The set of options is fixed at creation: an update can change them but not add or remove one.\n\nExactly one option has `is_primary: true`, whatever the `rate_mode` (`cascade` included); no primary option, or more than one, is refused with `422` (`details.options: [\"should have exactly one primary option\"]`). Each occupancy appears once — `2` and `\"2\"` count as the same value; a repeated occupancy is refused with `422` (`details.options: [\"occupancy 2 is duplicated\"]`, several values sorted and joined: `\"occupancy 1, 2 is duplicated\"`). An `occupancy` that is neither an integer nor a string that parses as one (for example `\"five\"`) is refused with `422` (`details.options: [\"occupancy is invalid\"]`).\n\nThe options are validated as a whole: an invalid option, primary or not, fails the request and nothing is created. The response carries every option created."
          },
          "auto_rate_settings": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.AutoRateSettingsWrite"
              },
              {
                "type": "null"
              }
            ],
            "description": "How rate options are derived from the primary occupancy option. Applied only when `rate_mode` is `auto`; when `rate_mode` is `auto` and nothing is sent, zero-valued amount settings are stored."
          },
          "children_fee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Additional fee added to the normal price for a Children guest (per Hotel Age Policy): a decimal string, or an integer in the currency's minor units.",
            "examples": [
              "0.00"
            ]
          },
          "infant_fee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Additional fee added to the normal price for an Infant guest (per Hotel Age Policy): a decimal string, or an integer in the currency's minor units.",
            "examples": [
              "0.00"
            ]
          },
          "max_stay": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                }
              }
            ],
            "description": "Default Max Stay restriction: a single value for every weekday, or 7 per-weekday values, Monday first. `0` means no limit."
          },
          "min_stay_arrival": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.positiveInt"
                }
              }
            ],
            "description": "Default Min Stay Arrival restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "min_stay_through": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.positiveInt"
                }
              }
            ],
            "description": "Default Min Stay Through restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "closed_to_arrival": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            ],
            "description": "Default Closed To Arrival restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "closed_to_departure": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            ],
            "description": "Default Closed To Departure restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "stop_sell": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            ],
            "description": "Default Stop Sell restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          }
        },
        "description": "Rate plan attributes accepted when creating a rate plan. A new rate plan gets default per-day values (rate 0, stop sell off, min stay 1) — use the ARI endpoints to send values per day."
      },
      "RatePlans.RatePlanCreateRequest": {
        "type": "object",
        "required": [
          "rate_plan"
        ],
        "properties": {
          "rate_plan": {
            "$ref": "#/components/schemas/RatePlans.RatePlanCreate"
          }
        },
        "description": "Request body accepted when creating a rate plan."
      },
      "RatePlans.RatePlanOption": {
        "type": "object",
        "required": [
          "id",
          "title",
          "occupancy",
          "currency",
          "meal_type",
          "sell_mode",
          "ui_read_only",
          "parent_rate_plan_id",
          "property_id",
          "rate_category_id",
          "room_type_id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "examples": [
              "bab451e7-9ab1-4cc4-aa16-107bf7bbabb2"
            ]
          },
          "title": {
            "type": "string",
            "examples": [
              "Best Available Rate"
            ]
          },
          "occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Guest count of the primary occupancy option.",
            "examples": [
              3
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Rate plan currency."
          },
          "meal_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.MealType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Meal plan included in the rate plan, or null when none is set."
          },
          "sell_mode": {
            "$ref": "#/components/schemas/RatePlans.SellMode"
          },
          "ui_read_only": {
            "type": "boolean",
            "description": "Whether the rate plan is shown as read-only in the Channex interface."
          },
          "parent_rate_plan_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the parent rate plan, if any."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the rate plan belongs to.",
            "examples": [
              "716305c4-561a-4561-a187-7f5b8aeb5920"
            ]
          },
          "rate_category_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the associated rate category, if any."
          },
          "room_type_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the room type the rate plan sells.",
            "examples": [
              "994d1375-dbbd-4072-8724-b2ab32ce781b"
            ]
          }
        },
        "description": "A lightweight rate plan, as returned by the `/options` endpoint."
      },
      "RatePlans.RatePlanOptionResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "rate_plan"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/RatePlans.RatePlanOption"
          }
        },
        "description": "A lightweight rate plan option for selectors — no relationships or pagination."
      },
      "RatePlans.RatePlanRelationships": {
        "type": "object",
        "required": [
          "room_type",
          "property"
        ],
        "properties": {
          "room_type": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "room_type"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Room type the rate plan sells."
          },
          "property": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "property"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Property the rate plan belongs to."
          },
          "tax_set": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "tax_set"
                    ]
                  },
                  "attributes": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "$ref": "#/components/schemas/Common.Scalars.id"
                      },
                      "title": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "id",
                      "title"
                    ],
                    "description": "Identifier and title of the tax set."
                  }
                },
                "required": [
                  "id",
                  "type",
                  "attributes"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Tax set applied to the rate plan. Present in the single-record response when the rate plan has a tax set; absent from list, create and update responses."
          },
          "parent_rate_plan": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "rate_plan"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Parent Rate Plan the rate plan derives from. Present only when `parent_rate_plan_id` is set."
          },
          "channel": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "channel"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Channel that created the rate plan for its own mapping. Present only on such rate plans; they are listed by `GET /rate_plans` and skipped by `/options`."
          }
        },
        "description": "Relationships of a rate plan resource."
      },
      "RatePlans.RatePlanResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "rate_plan"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/RatePlans.RatePlan"
          },
          "relationships": {
            "$ref": "#/components/schemas/RatePlans.RatePlanRelationships"
          }
        },
        "description": "A rate plan as returned in responses."
      },
      "RatePlans.RatePlanUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Rate plan title, unique within a Room Type (case-sensitive). A title that is blank after trimming whitespace (for example `\"   \"`) is refused with `422` (`details.title: [\"can't be blank\"]`).",
            "examples": [
              "Best Available Rate"
            ]
          },
          "sell_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.SellMode"
              }
            ],
            "description": "How the rate plan is sold. Defaults to `per_room`. Cannot be changed after creation: on update a value other than the stored one is refused with `422` (`details.sell_mode: [\"can't be changed\"]`); the stored value is accepted."
          },
          "rate_mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RatePlans.RateMode"
              }
            ],
            "description": "How the rate is calculated. Defaults to `manual`."
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Rate plan currency, an ISO 4217 code. Defaults to the currency of the associated Property; a Property can have rate plans in different currencies. On create, an unsupported code is refused with `422` (`details.currency: [\"is invalid\"]`). Cannot be changed after creation: a value sent on update is ignored."
          },
          "meal_type": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.MealType"
              },
              {
                "type": "null"
              }
            ],
            "description": "Meal plan included in the rate plan. `none` by default; null once cleared."
          },
          "tax_set_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Tax Set applied to the rate plan, or null. Defaults to the Property's default Tax Set. The tax set also appears under relationships."
          },
          "cancellation_policy_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Cancellation Policy applied to the rate plan, or null."
          },
          "ui_read_only": {
            "type": "boolean",
            "description": "Whether the rate plan is shown as read-only in the Channex interface."
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged."
          },
          "inherit_rate": {
            "type": "boolean",
            "description": "Whether `rate` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_closed_to_arrival": {
            "type": "boolean",
            "description": "Whether `closed_to_arrival` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_closed_to_departure": {
            "type": "boolean",
            "description": "Whether `closed_to_departure` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_stop_sell": {
            "type": "boolean",
            "description": "Whether `stop_sell` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_min_stay_arrival": {
            "type": "boolean",
            "description": "Whether `min_stay_arrival` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_min_stay_through": {
            "type": "boolean",
            "description": "Whether `min_stay_through` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_max_stay": {
            "type": "boolean",
            "description": "Whether `max_stay` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_max_availability": {
            "type": "boolean",
            "description": "Whether `max_availability` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "inherit_availability_offset": {
            "type": "boolean",
            "description": "Whether `availability_offset` follows the Parent Rate Plan: when `true`, the value is derived from the parent on every change and cannot be set on this rate plan directly. Defaults to `false`; `true` requires `parent_rate_plan_id`."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property to associate with the rate plan. Cannot be changed after creation."
          },
          "room_type_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Room Type the rate plan sells. Must belong to the Property. Cannot be changed after creation."
          },
          "parent_rate_plan_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the Rate Plan to derive this rate plan from. Must be a rate plan of the same Property; it may sell another Room Type. When set on create without `rate_mode`, the rate plan is created with `rate_mode: derived`. `null` detaches the parent."
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatePlans.OccupancyOptionWrite"
            },
            "description": "Occupancy options to change, matched to the rate plan's existing options by `occupancy` — `2` and `\"2\"` match the same option. A matched option takes the values sent; an option the rate plan does not have is ignored, and an option absent from the list is left unchanged. Options cannot be added or removed after creation. Every entry carries an `occupancy`: a missing one is refused with `422` (`details.options: [\"occupancy is required for every option\"]`), one that is neither an integer nor a string that parses as one (for example `\"five\"`) with `422` (`details.options: [\"occupancy is invalid\"]`)."
          },
          "auto_rate_settings": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RatePlans.AutoRateSettingsWrite"
              },
              {
                "type": "null"
              }
            ],
            "description": "How rate options are derived from the primary occupancy option. Applied only when `rate_mode` is `auto`; when `rate_mode` is `auto` and nothing is sent, zero-valued amount settings are stored."
          },
          "children_fee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Additional fee added to the normal price for a Children guest (per Hotel Age Policy): a decimal string, or an integer in the currency's minor units.",
            "examples": [
              "0.00"
            ]
          },
          "infant_fee": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Additional fee added to the normal price for an Infant guest (per Hotel Age Policy): a decimal string, or an integer in the currency's minor units.",
            "examples": [
              "0.00"
            ]
          },
          "max_stay": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                }
              }
            ],
            "description": "Default Max Stay restriction: a single value for every weekday, or 7 per-weekday values, Monday first. `0` means no limit."
          },
          "min_stay_arrival": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.positiveInt"
                }
              }
            ],
            "description": "Default Min Stay Arrival restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "min_stay_through": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.positiveInt"
                }
              }
            ],
            "description": "Default Min Stay Through restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "closed_to_arrival": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            ],
            "description": "Default Closed To Arrival restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "closed_to_departure": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            ],
            "description": "Default Closed To Departure restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          },
          "stop_sell": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            ],
            "description": "Default Stop Sell restriction: a single value for every weekday, or 7 per-weekday values, Monday first."
          }
        },
        "description": "Rate plan attributes accepted when updating a rate plan. Every attribute is optional; attributes absent from the request are left unchanged."
      },
      "RatePlans.RatePlanUpdateRequest": {
        "type": "object",
        "required": [
          "rate_plan"
        ],
        "properties": {
          "rate_plan": {
            "$ref": "#/components/schemas/RatePlans.RatePlanUpdate"
          }
        },
        "description": "Request body accepted when updating a rate plan."
      },
      "RatePlans.SellMode": {
        "type": "string",
        "enum": [
          "per_room",
          "per_person"
        ],
        "description": "How the rate plan is sold. `per_room` — one price regardless of guest count; `per_person` — price depends on guest count."
      },
      "ReferenceData.Currency": {
        "type": "object",
        "required": [
          "code",
          "label"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "ISO 4217 currency code.",
            "examples": [
              "USD"
            ]
          },
          "label": {
            "type": "string",
            "description": "Human-readable currency name including its code.",
            "examples": [
              "US Dollar (USD)"
            ]
          }
        },
        "description": "A supported currency."
      },
      "ReferenceData.Timezone": {
        "type": "object",
        "required": [
          "label",
          "utc",
          "tzCode"
        ],
        "properties": {
          "label": {
            "type": "string",
            "description": "Human-readable label combining the zone name and its UTC offset.",
            "examples": [
              "Europe/London (UTC+00:00)"
            ]
          },
          "utc": {
            "type": "string",
            "description": "Current UTC offset in `±HH:MM` form.",
            "examples": [
              "+00:00"
            ]
          },
          "tzCode": {
            "type": "string",
            "description": "IANA time zone identifier.",
            "examples": [
              "Europe/London"
            ]
          }
        },
        "description": "An IANA time zone with its current UTC offset."
      },
      "Restrictions.AvailabilityDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "object",
              "unevaluatedProperties": {
                "type": "integer",
                "format": "int32"
              }
            }
          }
        },
        "description": "Answer of the Get Availability method: each key is a Room Type id, each Room\nType maps dates (`YYYY-MM-DD`) to the number of rooms available to sell on\nthat date. The number can be negative. A Property the caller cannot reach\nyields an empty document."
      },
      "Restrictions.AvailabilityUpdate": {
        "type": "object",
        "required": [
          "property_id",
          "room_type_id",
          "availability"
        ],
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property."
          },
          "room_type_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Room Type."
          },
          "date": {
            "type": "string",
            "format": "date",
            "description": "Single date the change applies to. Give either this or the `date_from`–`date_to` pair, never both."
          },
          "date_from": {
            "type": "string",
            "format": "date",
            "description": "Start of the applicable date range. Required together with `date_to` when `date` is not given."
          },
          "date_to": {
            "type": "string",
            "format": "date",
            "description": "End of the applicable date range. Required together with `date_from` when `date` is not given."
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Restrictions.Weekday"
            },
            "description": "Days of the week to affect within `date_from`–`date_to`; omitted means every day. Ignored when a single `date` is given.",
            "examples": [
              [
                "sa",
                "su"
              ]
            ]
          },
          "availability": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of rooms available to sell. A whole number, zero or more.",
            "examples": [
              2
            ]
          }
        },
        "description": "One availability change. Targets either a single `date` or the range\n`date_from`–`date_to`."
      },
      "Restrictions.AvailabilityUpdateRequest": {
        "type": "object",
        "required": [
          "values"
        ],
        "properties": {
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Restrictions.AvailabilityUpdate"
            },
            "description": "The changes to apply, in order: a later change overrides an earlier one on the dates they share."
          }
        },
        "description": "Request body accepted when updating availability."
      },
      "Restrictions.OccupancyRate": {
        "type": "object",
        "required": [
          "occupancy",
          "rate"
        ],
        "properties": {
          "occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Occupancy the rate applies to.",
            "examples": [
              2
            ]
          },
          "rate": {
            "$ref": "#/components/schemas/Restrictions.RateValue"
          }
        },
        "description": "A rate for a specific occupancy of a multi-occupancy Rate Plan."
      },
      "Restrictions.RateValue": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/Common.Scalars.decimalString"
          },
          {
            "$ref": "#/components/schemas/Common.Scalars.positiveInt"
          }
        ],
        "description": "A rate value. Two forms are accepted: a decimal amount written as a string\n(`\"200.00\"`), or an integer in the minimum fraction of the currency (`20000`\nfor 200.00 USD). Both avoid floating-point issues, and a bare fractional\nnumber is refused. Must be greater than 0."
      },
      "Restrictions.RestrictionKind": {
        "type": "string",
        "enum": [
          "availability",
          "availability_offset",
          "closed_to_arrival",
          "closed_to_departure",
          "max_availability",
          "max_sell",
          "max_stay",
          "min_stay_arrival",
          "min_stay_through",
          "rate",
          "stop_sell",
          "stop_sell_manual"
        ],
        "description": "A value that can be read back for a Rate Plan and date.\n`availability` — rooms left to sell, derived from the Room Type.\n`availability_offset` — amount subtracted from the Room Type availability before it is published.\n`closed_to_arrival` — a stay may not begin on the date.\n`closed_to_departure` — a stay may not end on the date.\n`max_availability` — ceiling on published availability, or `null` for none.\n`max_sell` — maximum rooms that may be sold on the date, or `null` for no limit.\n`max_stay` — maximum nights a stay may run; `0` means no maximum.\n`min_stay_arrival` — minimum nights a stay arriving on the date must run.\n`min_stay_through` — minimum nights a stay covering the date must run.\n`rate` — the price for the date.\n`stop_sell` — whether the date is closed for sale.\n`stop_sell_manual` — whether the date is closed because it was closed explicitly, rather than because its availability or rate is 0."
      },
      "Restrictions.RestrictionUpdate": {
        "type": "object",
        "required": [
          "property_id",
          "rate_plan_id"
        ],
        "properties": {
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property."
          },
          "rate_plan_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Rate Plan."
          },
          "date": {
            "type": "string",
            "format": "date",
            "description": "Single date the change applies to. Past dates are refused. Give either this or the `date_from`–`date_to` pair, never both."
          },
          "date_from": {
            "type": "string",
            "format": "date",
            "description": "Start of the applicable date range. Past dates are refused. Required together with `date_to` when `date` is not given."
          },
          "date_to": {
            "type": "string",
            "format": "date",
            "description": "End of the applicable date range. Past dates are refused. Required together with `date_from` when `date` is not given."
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Restrictions.Weekday"
            },
            "description": "Days of the week to affect within `date_from`–`date_to`; omitted means every day. Ignored when a single `date` is given.",
            "examples": [
              [
                "sa",
                "su"
              ]
            ]
          },
          "rate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Restrictions.RateValue"
              }
            ],
            "description": "Rate for the date. Must be greater than 0 and within the Property's price\nlimits, and cannot be unset once given — `null` and `0` are both refused."
          },
          "rates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Restrictions.OccupancyRate"
            },
            "description": "Per-occupancy rates for a multi-occupancy Rate Plan, as an alternative to the single `rate`."
          },
          "min_stay_arrival": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Minimum nights a stay arriving on the date must run. At least 1."
          },
          "min_stay_through": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Minimum nights a stay covering the date must run. At least 1."
          },
          "min_stay": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Shorthand for whichever minimum stay the Property uses: the value is written\nto `min_stay_arrival` or `min_stay_through` according to\n`property.settings.min_stay_type`. A Property whose `min_stay_type` is\n`both` refuses it — send the specific restriction instead."
          },
          "max_stay": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Maximum nights a stay may run; `0` means no maximum."
          },
          "max_sell": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum rooms that may be sold on the date. `null` removes the limit."
          },
          "closed_to_arrival": {
            "type": "boolean",
            "description": "Whether a stay may not begin on the date. `0` and `1` are accepted as boolean representations."
          },
          "closed_to_departure": {
            "type": "boolean",
            "description": "Whether a stay may not end on the date. `0` and `1` are accepted as boolean representations."
          },
          "stop_sell": {
            "type": "boolean",
            "description": "Whether to close the date for sale. `0` and `1` are accepted as boolean\nrepresentations. A date whose availability or rate is 0 stays closed even\nwhen this is `false`."
          }
        },
        "description": "One rate/restrictions change. Targets either a single `date` or the range\n`date_from`–`date_to`, optionally narrowed to specific `days`."
      },
      "Restrictions.RestrictionValues": {
        "type": "object",
        "properties": {
          "availability": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Rooms available to sell for the Rate Plan, derived from the Room Type availability. Zero or more."
          },
          "rate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Rate for the Rate Plan on this date, whichever form the request that set it used.",
            "examples": [
              "200.00"
            ]
          },
          "min_stay_arrival": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Minimum nights a stay arriving on this date must run."
          },
          "min_stay_through": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Minimum nights a stay covering this date must run."
          },
          "max_stay": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Maximum nights a stay may run; `0` means no maximum."
          },
          "closed_to_arrival": {
            "type": "boolean",
            "description": "Whether a stay may not begin on this date."
          },
          "closed_to_departure": {
            "type": "boolean",
            "description": "Whether a stay may not end on this date."
          },
          "stop_sell": {
            "type": "boolean",
            "description": "Whether the date is closed for sale. A date whose availability or rate is 0\nis closed whether or not it was closed explicitly."
          },
          "stop_sell_manual": {
            "type": "boolean",
            "description": "Whether the date is closed because it was closed explicitly, rather than because its availability or rate is 0."
          },
          "availability_offset": {
            "type": "integer",
            "format": "int32",
            "description": "Amount subtracted from the Room Type availability before it is published. Set through Channel Availability Rules, not here."
          },
          "max_availability": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Ceiling on published availability, or null for none. Set through Channel Availability Rules, not here."
          },
          "max_sell": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum rooms that may be sold on this date, or null for no limit."
          }
        },
        "description": "Values for one Rate Plan and date. Only the values named in\n`filter[restrictions]` are present."
      },
      "Restrictions.RestrictionsDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "object",
              "unevaluatedProperties": {
                "$ref": "#/components/schemas/Restrictions.RestrictionValues"
              }
            }
          }
        },
        "description": "Answer of the Get Restrictions method: each key is a Rate Plan id, each Rate\nPlan maps dates (`YYYY-MM-DD`) to the values requested for that date. A Rate\nPlan with no state for the requested dates maps to an empty object, and a\nProperty the caller cannot reach yields an empty document."
      },
      "Restrictions.RestrictionsUpdateRequest": {
        "type": "object",
        "required": [
          "values"
        ],
        "properties": {
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Restrictions.RestrictionUpdate"
            },
            "description": "The changes to apply, in order: a later change overrides an earlier one on the dates they share."
          }
        },
        "description": "Request body accepted when updating rates and restrictions."
      },
      "Restrictions.TaskReference": {
        "type": "object",
        "required": [
          "id",
          "type"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "examples": [
              "eb31d631-4fcc-478a-80c3-bf7a2acf0699"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "task"
            ]
          }
        },
        "description": "Reference to a background task produced by an update. Its progress can be read through the Tasks resource."
      },
      "Restrictions.UpdateAcknowledgement": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Restrictions.TaskReference"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "message": {
                "type": "string",
                "examples": [
                  "Success"
                ]
              },
              "warnings": {
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Restrictions.UpdateWarning"
                    },
                    {
                      "type": "string"
                    }
                  ]
                },
                "description": "The change objects that were rejected, and why. Present only when there are any."
              }
            },
            "required": [
              "message"
            ]
          }
        },
        "description": "Acknowledgement of an ARI update. Changes are applied asynchronously: `data`\nreferences the background tasks produced, one per Property, and is empty when\nevery change object was rejected. A rejected change object never fails the\nrequest — it is reported under `meta.warnings` while the rest is applied, and\nthe status is still `200 OK`."
      },
      "Restrictions.UpdateWarning": {
        "type": "object",
        "required": [
          "warning"
        ],
        "properties": {
          "warning": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Maps each rejected field to the reasons it was rejected.",
            "examples": [
              {
                "rate": [
                  "must be greater than 0"
                ]
              }
            ]
          }
        },
        "unevaluatedProperties": {},
        "description": "A change object rejected from an update: the submitted fields echoed back —\nthey may hold arbitrarily invalid data — plus `warning` with the reason per\nfield."
      },
      "Restrictions.Weekday": {
        "type": "string",
        "enum": [
          "mo",
          "tu",
          "we",
          "th",
          "fr",
          "sa",
          "su"
        ],
        "description": "A day-of-week name in two-letter format."
      },
      "RoomTypes.RoomKind": {
        "type": "string",
        "enum": [
          "room",
          "dorm"
        ],
        "description": "Kind of room type. A `dorm` sells beds within a shared physical room; a `room` sells the whole unit."
      },
      "RoomTypes.RoomType": {
        "type": "object",
        "required": [
          "id",
          "position",
          "title",
          "count_of_rooms",
          "occ_adults",
          "occ_children",
          "occ_infants",
          "default_occupancy",
          "room_kind",
          "capacity",
          "codes",
          "meta",
          "content"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique room type identifier.",
            "examples": [
              "994d1375-dbbd-4072-8724-b2ab32ce781b"
            ]
          },
          "position": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Zero-based display position of the room type. Set with the `update_positions` endpoint.",
            "examples": [
              0
            ]
          },
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Room type title, as shown in the system. Unique within the property.",
            "examples": [
              "Standard Room"
            ]
          },
          "count_of_rooms": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Number of rooms (units) of this type available to sell. Affects billing for vacation rentals.",
            "examples": [
              20
            ]
          },
          "occ_adults": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Number of adult bed spaces in the room type.",
            "examples": [
              3
            ]
          },
          "occ_children": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of child-only bed spaces. Children may also sleep in adult beds; set to 0 if there are no child-only beds.",
            "examples": [
              0
            ]
          },
          "occ_infants": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of infant cots available in the room type.",
            "examples": [
              0
            ]
          },
          "default_occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Guests accommodated by default without extra spaces. Defaults to `occ_adults` and is silently lowered to it when a larger value is sent. Lowering `occ_adults` lowers this too.",
            "deprecated": true,
            "examples": [
              2
            ]
          },
          "room_kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RoomTypes.RoomKind"
              }
            ],
            "description": "Kind of room type. Defaults to `room`."
          },
          "capacity": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Number of beds in a single physical room, used for `dorm` room types. Stored and returned whatever the `room_kind`; `null` until set.",
            "examples": [
              4
            ]
          },
          "codes": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged.",
            "examples": [
              {
                "pms": "RT-42"
              }
            ]
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged."
          },
          "content": {
            "$ref": "#/components/schemas/RoomTypes.RoomTypeContent"
          }
        },
        "description": "A room type (an accommodation inventory unit — a room, villa, or dormitory bed) as returned in responses: every attribute is present."
      },
      "RoomTypes.RoomTypeContent": {
        "type": "object",
        "required": [
          "description",
          "photos"
        ],
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Room type description. Null by default."
          },
          "photos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Photos.Photo"
            },
            "description": "Photos attached to the room type. A room type holds at most 10 of them, counted separately from the property's own photos and from every other room type's. See the Photos resource for the full model and management endpoints."
          }
        },
        "description": "Room type content as returned in responses."
      },
      "RoomTypes.RoomTypeContentWrite": {
        "type": "object",
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Room type description. Null by default."
          },
          "photos": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Photos.EmbeddedPhotoWrite"
            },
            "description": "Photos to attach to the room type. The list is merged into the room type's photos rather than replacing them: an entry with a new `url` attaches a photo, an entry carrying `id` updates that photo, photos the list does not name are kept, and an entry with `is_removed: true` removes the photo it names. A room type holds at most 10 photos, counted separately from the property's own photos and from every other room type's: a request that would take the count past 10 is refused, while one that does not raise it is accepted even for a room type already holding more, and removing a photo frees its place. See the Photos resource for the full model."
          }
        },
        "description": "Room type content accepted on create and update."
      },
      "RoomTypes.RoomTypeCreate": {
        "type": "object",
        "required": [
          "title",
          "count_of_rooms",
          "occ_adults",
          "occ_children",
          "occ_infants",
          "property_id"
        ],
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Room type title, as shown in the system. Unique within the property.",
            "examples": [
              "Standard Room"
            ]
          },
          "count_of_rooms": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Number of rooms (units) of this type available to sell. Affects billing for vacation rentals.",
            "examples": [
              20
            ]
          },
          "occ_adults": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Number of adult bed spaces in the room type.",
            "examples": [
              3
            ]
          },
          "occ_children": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of child-only bed spaces. Children may also sleep in adult beds; set to 0 if there are no child-only beds.",
            "examples": [
              0
            ]
          },
          "occ_infants": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of infant cots available in the room type.",
            "examples": [
              0
            ]
          },
          "default_occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Guests accommodated by default without extra spaces. Defaults to `occ_adults` and is silently lowered to it when a larger value is sent. Lowering `occ_adults` lowers this too.",
            "deprecated": true,
            "examples": [
              2
            ]
          },
          "room_kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RoomTypes.RoomKind"
              }
            ],
            "description": "Kind of room type. Defaults to `room`."
          },
          "capacity": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Number of beds in a single physical room, used for `dorm` room types. Stored and returned whatever the `room_kind`; `null` until set.",
            "examples": [
              4
            ]
          },
          "codes": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged.",
            "examples": [
              {
                "pms": "RT-42"
              }
            ]
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property this room type belongs to. Cannot be changed after the room type is created: a different value is refused, the same value is accepted."
          },
          "facilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Room type facility identifiers. See the Room Type Facilities endpoint for the available identifiers. The list replaces the room type's current facilities: facilities it does not name are detached, `[]` detaches all, identifiers naming no facility are dropped, and a duplicate counts once."
          },
          "content": {
            "$ref": "#/components/schemas/RoomTypes.RoomTypeContentWrite"
          }
        },
        "description": "Room type attributes accepted when creating a room type."
      },
      "RoomTypes.RoomTypeCreateRequest": {
        "type": "object",
        "required": [
          "room_type"
        ],
        "properties": {
          "room_type": {
            "$ref": "#/components/schemas/RoomTypes.RoomTypeCreate"
          }
        },
        "description": "Request body accepted when creating a room type."
      },
      "RoomTypes.RoomTypeOption": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "room_type"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/RoomTypes.RoomTypeOptionAttributes"
          }
        },
        "description": "A lightweight room type option for selectors — no relationships or pagination."
      },
      "RoomTypes.RoomTypeOptionAttributes": {
        "type": "object",
        "required": [
          "id",
          "title",
          "occ_adults",
          "occ_children",
          "occ_infants",
          "default_occupancy",
          "position",
          "photo",
          "property_id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "examples": [
              "994d1375-dbbd-4072-8724-b2ab32ce781b"
            ]
          },
          "title": {
            "type": "string",
            "examples": [
              "Standard Room"
            ]
          },
          "occ_adults": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Number of adult bed spaces in the room type.",
            "examples": [
              3
            ]
          },
          "occ_children": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of child-only bed spaces.",
            "examples": [
              0
            ]
          },
          "occ_infants": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of infant cots available in the room type.",
            "examples": [
              0
            ]
          },
          "default_occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Guests accommodated by default without extra spaces.",
            "examples": [
              2
            ]
          },
          "position": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Zero-based display position of the room type. Set with the `update_positions` endpoint.",
            "examples": [
              0
            ]
          },
          "photo": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "format": "uri",
            "description": "URL of the room type's photo. `null` when the room type has no photo.",
            "examples": [
              "https://images.channex.io/cce1fbdb-e7be-4804-1f71-f7617cb7cc00/"
            ]
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the room type belongs to.",
            "examples": [
              "2941337f-50d6-4189-ae13-f76efaf9c515"
            ]
          }
        },
        "description": "Attributes of a room type `/options` item: identifier, title, occupancy, display position, photo, and owning property."
      },
      "RoomTypes.RoomTypeRelationships": {
        "type": "object",
        "required": [
          "property",
          "facilities"
        ],
        "properties": {
          "property": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "property"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Property the room type belongs to."
          },
          "facilities": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Facilities.FacilityResource"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "Facilities associated with the room type. Each item is a facility resource carrying its `title` and `category`."
          }
        },
        "description": "Relationships of a room type resource."
      },
      "RoomTypes.RoomTypeResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "room_type"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/RoomTypes.RoomType"
          },
          "relationships": {
            "$ref": "#/components/schemas/RoomTypes.RoomTypeRelationships"
          }
        },
        "description": "A room type as returned in responses."
      },
      "RoomTypes.RoomTypeUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Room type title, as shown in the system. Unique within the property.",
            "examples": [
              "Standard Room"
            ]
          },
          "count_of_rooms": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Number of rooms (units) of this type available to sell. Affects billing for vacation rentals.",
            "examples": [
              20
            ]
          },
          "occ_adults": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Number of adult bed spaces in the room type.",
            "examples": [
              3
            ]
          },
          "occ_children": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of child-only bed spaces. Children may also sleep in adult beds; set to 0 if there are no child-only beds.",
            "examples": [
              0
            ]
          },
          "occ_infants": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Number of infant cots available in the room type.",
            "examples": [
              0
            ]
          },
          "default_occupancy": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              }
            ],
            "description": "Guests accommodated by default without extra spaces. Defaults to `occ_adults` and is silently lowered to it when a larger value is sent. Lowering `occ_adults` lowers this too.",
            "deprecated": true,
            "examples": [
              2
            ]
          },
          "room_kind": {
            "allOf": [
              {
                "$ref": "#/components/schemas/RoomTypes.RoomKind"
              }
            ],
            "description": "Kind of room type. Defaults to `room`."
          },
          "capacity": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "Number of beds in a single physical room, used for `dorm` room types. Stored and returned whatever the `room_kind`; `null` until set.",
            "examples": [
              4
            ]
          },
          "codes": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged.",
            "examples": [
              {
                "pms": "RT-42"
              }
            ]
          },
          "meta": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {}
              },
              {
                "type": "null"
              }
            ],
            "description": "Free-form object stored for the client's own use, or null. The platform neither reads nor writes it: an object sent here comes back unchanged."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property this room type belongs to. Cannot be changed after the room type is created: a different value is refused, the same value is accepted."
          },
          "facilities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Room type facility identifiers. See the Room Type Facilities endpoint for the available identifiers. The list replaces the room type's current facilities: facilities it does not name are detached, `[]` detaches all, identifiers naming no facility are dropped, and a duplicate counts once."
          },
          "content": {
            "$ref": "#/components/schemas/RoomTypes.RoomTypeContentWrite"
          }
        },
        "description": "Room type attributes accepted when updating a room type. Every attribute is optional; attributes absent from the request are left unchanged."
      },
      "RoomTypes.RoomTypeUpdateRequest": {
        "type": "object",
        "required": [
          "room_type"
        ],
        "properties": {
          "room_type": {
            "$ref": "#/components/schemas/RoomTypes.RoomTypeUpdate"
          }
        },
        "description": "Request body accepted when updating a room type."
      },
      "SigningKeys.SigningKey": {
        "type": "object",
        "required": [
          "id",
          "inserted_at",
          "updated_at",
          "rotated_at",
          "title"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique signing key identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "f2b45efc-9917-44f5-b6ac-3c26468bdb47"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the key was created (ISO 8601, no timezone offset).",
            "examples": [
              "2026-06-17T02:56:37.717460"
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the key was last updated (ISO 8601, no timezone offset).",
            "examples": [
              "2026-06-17T02:56:37.717460"
            ]
          },
          "rotated_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "format": "date-time",
            "description": "When the key was last rotated (ISO 8601, no timezone offset). Null until the first rotation.",
            "examples": [
              "2026-09-17T09:05:12.331907"
            ]
          },
          "title": {
            "type": "string",
            "description": "Human-readable name of the key.",
            "examples": [
              "Production signing key"
            ]
          }
        },
        "description": "An HMAC signing key for webhook deliveries. The secrets live in the key's\nversions and are masked to `...` + last 6 everywhere except the create\nand generate responses."
      },
      "SigningKeys.SigningKeyCreate": {
        "type": "object",
        "required": [
          "title",
          "billing_account_id"
        ],
        "properties": {
          "title": {
            "type": "string",
            "description": "Human-readable name of the key.",
            "examples": [
              "Production signing key"
            ]
          },
          "billing_account_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the billing account that owns the key. The caller must be an owner of that account; naming another answers `403`.",
            "examples": [
              "716305c4-561a-4561-a187-7f5b8aeb5920"
            ]
          }
        },
        "description": "Attributes accepted when creating a signing key."
      },
      "SigningKeys.SigningKeyCreateRequest": {
        "type": "object",
        "required": [
          "signing_key"
        ],
        "properties": {
          "signing_key": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyCreate"
          }
        },
        "description": "Request body accepted when creating a signing key."
      },
      "SigningKeys.SigningKeyOption": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "signing_key"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyOptionAttributes"
          }
        },
        "description": "A signing key `/options` item: no relationships, attributes only."
      },
      "SigningKeys.SigningKeyOptionAttributes": {
        "type": "object",
        "required": [
          "id",
          "title",
          "secret"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "examples": [
              "f2b45efc-9917-44f5-b6ac-3c26468bdb47"
            ]
          },
          "title": {
            "type": "string",
            "examples": [
              "Production signing key"
            ]
          },
          "secret": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The current version's secret masked to `...` plus its last 6 characters. Null for a\nkey without a current version.",
            "examples": [
              "...i_rH1w"
            ]
          }
        },
        "description": "Attributes of a signing key `/options` item: identifier, title and the masked active key."
      },
      "SigningKeys.SigningKeyRelationships": {
        "type": "object",
        "required": [
          "signing_key_versions",
          "webhooks"
        ],
        "properties": {
          "signing_key_versions": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/SigningKeys.SigningKeyVersionResource"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "The key's secret versions — the current one first, then oldest first. Secrets are masked to `...` plus their last 6 characters."
          },
          "webhooks": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/SigningKeys.SigningKeyWebhookResource"
                }
              }
            },
            "required": [
              "data"
            ],
            "description": "The webhooks that sign their deliveries with the key, oldest first. Empty when no webhook uses it."
          }
        },
        "description": "Relationships of a signing key: its secret versions and the webhooks using it."
      },
      "SigningKeys.SigningKeyResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "signing_key"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/SigningKeys.SigningKey"
          },
          "relationships": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyRelationships"
          }
        },
        "description": "A signing key resource with its masked versions."
      },
      "SigningKeys.SigningKeyUpdate": {
        "type": "object",
        "required": [
          "title"
        ],
        "properties": {
          "title": {
            "type": "string",
            "description": "Human-readable name of the key.",
            "examples": [
              "Production signing key"
            ]
          }
        },
        "description": "Attributes accepted when updating a signing key. Only the title can be changed."
      },
      "SigningKeys.SigningKeyUpdateRequest": {
        "type": "object",
        "required": [
          "signing_key"
        ],
        "properties": {
          "signing_key": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyUpdate"
          }
        },
        "description": "Request body accepted when updating a signing key."
      },
      "SigningKeys.SigningKeyVersion": {
        "type": "object",
        "required": [
          "id",
          "is_current",
          "secret",
          "inserted_at"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique version identifier. Mirrors the resource `id`.",
            "examples": [
              "058457e7-b76c-4654-9228-ec8395b0121b"
            ]
          },
          "is_current": {
            "type": "boolean",
            "description": "Whether this is the key's current version. A key has one current version and at most\none pending version awaiting rotation.",
            "examples": [
              true
            ]
          },
          "secret": {
            "type": "string",
            "description": "The version's secret masked to `...` plus its last 6 characters — the label\nidentifying the version in the `x-hmac-keys-256` delivery header and in API\nresponses. The full secret is never rendered here.",
            "examples": [
              "...i_rH1w"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the version was created (ISO 8601, no timezone offset).",
            "examples": [
              "2026-06-17T02:56:37.717460"
            ]
          }
        },
        "description": "A secret version of a signing key."
      },
      "SigningKeys.SigningKeyVersionResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "signing_key_version"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyVersion"
          }
        },
        "description": "A secret version of a signing key. Carries no relationships."
      },
      "SigningKeys.SigningKeyWebhook": {
        "type": "object",
        "required": [
          "id",
          "callback_url",
          "event_mask",
          "is_global"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique webhook identifier. Mirrors the resource `id`.",
            "examples": [
              "59f4e1a9-b158-42c6-9130-6f0a08c1ec41"
            ]
          },
          "callback_url": {
            "type": "string",
            "format": "uri",
            "description": "URL the webhook delivers to.",
            "examples": [
              "https://your-website.com/api/push_message"
            ]
          },
          "event_mask": {
            "type": "string",
            "description": "Events the webhook subscribes to: `*` for every event, or a semicolon-separated list of event names.",
            "examples": [
              "booking_new;booking_modification;booking_cancellation"
            ]
          },
          "is_global": {
            "type": "boolean",
            "description": "Whether the webhook covers every property of its billing account rather than one.",
            "examples": [
              false
            ]
          }
        },
        "description": "A webhook using the signing key, reduced to its identifying attributes."
      },
      "SigningKeys.SigningKeyWebhookResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "webhook"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyWebhook"
          }
        },
        "description": "A webhook that signs its deliveries with the key."
      },
      "SigningKeys.SigningKeyWithSecret": {
        "type": "object",
        "required": [
          "id",
          "inserted_at",
          "updated_at",
          "rotated_at",
          "title",
          "secret"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique signing key identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "f2b45efc-9917-44f5-b6ac-3c26468bdb47"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the key was created (ISO 8601, no timezone offset).",
            "examples": [
              "2026-06-17T02:56:37.717460"
            ]
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the key was last updated (ISO 8601, no timezone offset).",
            "examples": [
              "2026-06-17T02:56:37.717460"
            ]
          },
          "rotated_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "format": "date-time",
            "description": "When the key was last rotated (ISO 8601, no timezone offset). Null until the first rotation.",
            "examples": [
              "2026-09-17T09:05:12.331907"
            ]
          },
          "title": {
            "type": "string",
            "description": "Human-readable name of the key.",
            "examples": [
              "Production signing key"
            ]
          },
          "secret": {
            "type": "string",
            "description": "The full secret of the version the operation created. Exposed only in this\nresponse — store it now; every other rendering masks version secrets to\n`...` plus their last 6 characters.",
            "examples": [
              "2Rq0veIkKgmOG3vGZ9pZ0He4gCzC4wUJa8O0zi_rH1w"
            ]
          }
        },
        "description": "A signing key as returned by create and generate — the only responses carrying an unmasked `secret`."
      },
      "SigningKeys.SigningKeyWithSecretResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "signing_key"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyWithSecret"
          },
          "relationships": {
            "$ref": "#/components/schemas/SigningKeys.SigningKeyRelationships"
          }
        },
        "description": "A signing key resource carrying the secret of the version just created or promoted."
      },
      "StripeTokenizationApp.StripePaymentMethodDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "data": {
            "type": "object",
            "properties": {
              "token": {
                "type": "string",
                "description": "Stripe payment method of the booking's card.",
                "examples": [
                  "pm1234"
                ]
              }
            },
            "required": [
              "token"
            ]
          }
        },
        "description": "Response document carrying a Stripe payment method."
      },
      "StripeTokenizationApp.StripeTokenDocument": {
        "type": "object",
        "required": [
          "data"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "description": "Whether the request succeeded."
          },
          "data": {
            "type": "object",
            "properties": {
              "token": {
                "type": "string",
                "description": "Stripe token of the booking's card.",
                "examples": [
                  "tk1234"
                ]
              }
            },
            "required": [
              "token"
            ]
          }
        },
        "description": "Response document carrying a Stripe token."
      },
      "StripeTokenizationApp.TokenizeCardRequest": {
        "type": "object",
        "required": [
          "booking_id"
        ],
        "properties": {
          "booking_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the booking whose card to tokenize."
          }
        },
        "description": "Request body of the tokenization endpoints: the booking whose card to tokenize."
      },
      "Tasks.Task": {
        "type": "object",
        "required": [
          "id",
          "success",
          "uid",
          "errors",
          "task",
          "user_email",
          "user_name",
          "waiting_time",
          "execution_time",
          "received_at",
          "inserted_at",
          "executed_at",
          "finished_at",
          "property_id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique task identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "9de7ccd0-5254-454f-a61f-2fd8092293fc"
            ]
          },
          "success": {
            "type": "boolean",
            "description": "Whether the task completed successfully.",
            "examples": [
              true
            ]
          },
          "uid": {
            "type": "integer",
            "format": "int64",
            "description": "Numeric unique identifier for the task execution (microsecond-resolution timestamp).",
            "examples": [
              1776283211072671
            ]
          },
          "errors": {
            "type": "array",
            "items": {},
            "description": "Errors produced during execution. Empty when `success` is `true`."
          },
          "task": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Tasks.TaskType"
              }
            ],
            "description": "Type of operation the task carries out.",
            "examples": [
              "Property.UpdateDate"
            ]
          },
          "user_email": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              },
              {
                "type": "null"
              }
            ],
            "description": "Email of the user who triggered the task, or `null` for system-triggered tasks."
          },
          "user_name": {
            "type": "string",
            "description": "Display name of the user who triggered the task. `System` for system-triggered tasks.",
            "examples": [
              "System"
            ]
          },
          "waiting_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Time the task spent queued before execution started, in milliseconds.",
            "examples": [
              16
            ]
          },
          "execution_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Task execution duration, in milliseconds.",
            "examples": [
              254
            ]
          },
          "received_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the task was received (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.056375"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the task was recorded (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.416184"
            ]
          },
          "executed_at": {
            "type": "string",
            "format": "date-time",
            "description": "When execution started (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.072672"
            ]
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "description": "When execution finished (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.327201"
            ]
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the property the task belongs to.",
            "examples": [
              "18535b75-26a0-4716-ae99-0578006639c5"
            ]
          }
        },
        "description": "A task as returned in list responses."
      },
      "Tasks.TaskChannelEvent": {
        "type": "object",
        "required": [
          "id",
          "success",
          "channel_id",
          "channel_title"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique channel event identifier.",
            "examples": [
              "ce2bbd71-fc1a-4b03-b070-0a90b543ac85"
            ]
          },
          "success": {
            "type": "boolean",
            "description": "Whether the channel update succeeded.",
            "examples": [
              true
            ]
          },
          "channel_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the channel the event targets.",
            "examples": [
              "a2a767c0-187a-4476-9b23-8cceebe917d4"
            ]
          },
          "channel_title": {
            "type": "string",
            "description": "Display title of the channel.",
            "examples": [
              "demo"
            ]
          }
        },
        "description": "Outcome of a single channel update produced by a task."
      },
      "Tasks.TaskDetail": {
        "type": "object",
        "required": [
          "id",
          "success",
          "uid",
          "errors",
          "task",
          "user_email",
          "user_name",
          "waiting_time",
          "execution_time",
          "received_at",
          "inserted_at",
          "executed_at",
          "finished_at",
          "source",
          "payload",
          "ip_address",
          "channel_events",
          "timings"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique task identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "9de7ccd0-5254-454f-a61f-2fd8092293fc"
            ]
          },
          "success": {
            "type": "boolean",
            "description": "Whether the task completed successfully.",
            "examples": [
              true
            ]
          },
          "uid": {
            "type": "integer",
            "format": "int64",
            "description": "Numeric unique identifier for the task execution (microsecond-resolution timestamp).",
            "examples": [
              1776283211072671
            ]
          },
          "errors": {
            "type": "array",
            "items": {},
            "description": "Errors produced during execution. Empty when `success` is `true`."
          },
          "task": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Tasks.TaskType"
              }
            ],
            "description": "Type of operation the task carries out.",
            "examples": [
              "Property.UpdateDate"
            ]
          },
          "user_email": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.email"
              },
              {
                "type": "null"
              }
            ],
            "description": "Email of the user who triggered the task, or `null` for system-triggered tasks."
          },
          "user_name": {
            "type": "string",
            "description": "Display name of the user who triggered the task. `System` for system-triggered tasks.",
            "examples": [
              "System"
            ]
          },
          "waiting_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Time the task spent queued before execution started, in milliseconds.",
            "examples": [
              16
            ]
          },
          "execution_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Task execution duration, in milliseconds.",
            "examples": [
              254
            ]
          },
          "received_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the task was received (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.056375"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the task was recorded (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.416184"
            ]
          },
          "executed_at": {
            "type": "string",
            "format": "date-time",
            "description": "When execution started (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.072672"
            ]
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "description": "When execution finished (ISO 8601, no timezone offset).",
            "examples": [
              "2026-04-15T20:00:11.327201"
            ]
          },
          "source": {
            "type": "string",
            "description": "Origin of the task (e.g. `unknown`, an API client, or an internal system).",
            "examples": [
              "unknown"
            ]
          },
          "payload": {
            "type": "object",
            "unevaluatedProperties": {},
            "description": "Input payload the task was executed with. The shape depends on the task type."
          },
          "ip_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "IP address the task request originated from, or `null` for system-triggered tasks."
          },
          "channel_events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tasks.TaskChannelEvent"
            },
            "description": "Per-channel update outcomes produced by the task."
          },
          "timings": {
            "type": "array",
            "items": {
              "type": "array",
              "prefixItems": [
                {
                  "type": "string"
                },
                {
                  "type": "integer",
                  "format": "int32"
                }
              ]
            },
            "description": "Per-step execution timings as `[step_name, duration_ms]` pairs."
          }
        },
        "description": "A single task with full execution detail. Extends the list shape with the input\npayload, per-step timings, channel events, and request metadata; the top-level\n`property_id` is not present (it appears inside `payload`)."
      },
      "Tasks.TaskDetailResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "task"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Tasks.TaskDetail"
          }
        },
        "description": "A task resource with full execution detail."
      },
      "Tasks.TaskResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "task"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Tasks.Task"
          }
        },
        "description": "A task resource (list shape)."
      },
      "Tasks.TaskType": {
        "type": "string",
        "enum": [
          "Property.ActivateChannel",
          "Property.AddChannel",
          "Property.AddChannelAvailabilityRules",
          "Property.AddRatePlan",
          "Property.AddRoomType",
          "Property.AddWebhook",
          "Property.ApplyAvailabilityChanges",
          "Property.BackstageSync",
          "Property.DeactivateChannel",
          "Property.DeactivateWebhook",
          "Property.RecalculateAllCrossCurrencyRate",
          "Property.ReceiveBooking",
          "Property.RemoveChannel",
          "Property.RemoveChannelAvailabilityRules",
          "Property.RemoveRatePlan",
          "Property.RemoveRoomType",
          "Property.RemoveWebhook",
          "Property.SetCancellationPolicy",
          "Property.SetCutOffTime",
          "Property.SetTaxSet",
          "Property.UpdateAvailability",
          "Property.UpdateChannelAvailabilityRules",
          "Property.UpdateDate",
          "Property.UpdateMinStayType",
          "Property.UpdateProperty",
          "Property.UpdateRatePlan",
          "Property.UpdateRestrictions",
          "Property.UpdateRoomType",
          "Property.UpdateTimezone",
          "Property.UpdateWebhook"
        ],
        "description": "Type of operation a task carries out."
      },
      "TaxSets.TaxSet": {
        "type": "object",
        "required": [
          "id",
          "title",
          "currency",
          "associated_rate_plan_ids",
          "taxes"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique tax set identifier.",
            "examples": [
              "b70b756d-0b81-431d-a35c-f3dee28a00a7"
            ]
          },
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Tax set title.",
            "examples": [
              "Tax Set Title"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Tax set currency (ISO 4217). An unknown code answers 422."
          },
          "associated_rate_plan_ids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Rate Plans the set applies to. On write, each listed Rate Plan gets this set as its `tax_set_id` — a Rate Plan has one set at a time, so it leaves the set it had; `[]` detaches every Rate Plan, and a detached Rate Plan falls back to the property's default set. Every response carries the current list, `[]` when none."
          },
          "taxes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxSets.TaxSetTax"
            },
            "description": "Taxes in the set, each with the taxes calculated underneath it."
          }
        },
        "description": "A tax set as returned in responses: every attribute is present."
      },
      "TaxSets.TaxSetCreate": {
        "type": "object",
        "required": [
          "title",
          "currency",
          "property_id",
          "taxes"
        ],
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Tax set title.",
            "examples": [
              "Tax Set Title"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Tax set currency (ISO 4217). An unknown code answers 422."
          },
          "associated_rate_plan_ids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Rate Plans the set applies to. On write, each listed Rate Plan gets this set as its `tax_set_id` — a Rate Plan has one set at a time, so it leaves the set it had; `[]` detaches every Rate Plan, and a detached Rate Plan falls back to the property's default set. Every response carries the current list, `[]` when none."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the tax set belongs to. The first Tax Set created for a Property automatically becomes its default tax set. On update, a different Property moves the set to it."
          },
          "taxes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxSets.TaxSetTaxWrite"
            },
            "description": "Taxes to include in the set, by reference. Send an empty list for a set without taxes.\n\n`level` sets the calculation order. Example: a Cleaning Fee of 10.00 per night at level 1 and a 20% VAT at level 0 on a 100.00 night — level 1 is calculated first (fee 10.00), then level 0 on the night price plus the level-1 amounts (VAT 20% of 110.00 = 22.00). With both at level 0 the VAT is 20.00.",
            "examples": [
              [
                {
                  "id": "c1fb94b3-ce95-4233-be0e-2748b3728715",
                  "level": 1
                },
                {
                  "id": "a3c4f3c8-841c-4492-b5ff-ce9ca92c1c83",
                  "level": 0
                }
              ]
            ]
          }
        },
        "description": "Tax Set attributes accepted when creating a tax set."
      },
      "TaxSets.TaxSetCreateRequest": {
        "type": "object",
        "required": [
          "tax_set"
        ],
        "properties": {
          "tax_set": {
            "$ref": "#/components/schemas/TaxSets.TaxSetCreate"
          }
        },
        "description": "Request body accepted when creating a tax set."
      },
      "TaxSets.TaxSetOption": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "tax_set"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/TaxSets.TaxSetOptionAttributes"
          }
        },
        "description": "A lightweight tax set option for selectors — id, title, and currency, no relationships or pagination."
      },
      "TaxSets.TaxSetOptionAttributes": {
        "type": "object",
        "required": [
          "id",
          "title",
          "currency"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "title": {
            "type": "string"
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Tax set currency (ISO 4217)."
          }
        },
        "description": "Attributes of a tax set `/options` item: identifier, display title, and currency."
      },
      "TaxSets.TaxSetRelationships": {
        "type": "object",
        "required": [
          "property"
        ],
        "properties": {
          "property": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "property"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Property the tax set belongs to."
          }
        },
        "description": "Relationships of a tax set resource."
      },
      "TaxSets.TaxSetResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "tax_set"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/TaxSets.TaxSet"
          },
          "relationships": {
            "$ref": "#/components/schemas/TaxSets.TaxSetRelationships"
          }
        },
        "description": "A tax set as returned in responses."
      },
      "TaxSets.TaxSetTax": {
        "type": "object",
        "required": [
          "id",
          "title",
          "logic",
          "type",
          "is_inclusive",
          "currency",
          "skip_nights",
          "max_nights",
          "applicable_after",
          "applicable_before",
          "rate",
          "applicable_date_ranges",
          "taxes",
          "level"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique tax identifier.",
            "examples": [
              "6d30137e-74a1-41f6-aa96-2c0371e94dbf"
            ]
          },
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Tax title.",
            "examples": [
              "10% VAT"
            ]
          },
          "logic": {
            "$ref": "#/components/schemas/Taxes.TaxLogic"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Taxes.TaxType"
              }
            ],
            "description": "Kind of charge the tax represents. Defaults to `tax`."
          },
          "is_inclusive": {
            "type": "boolean",
            "description": "Whether the tax is included in the room price (`true`) or added on top (`false`). Defaults to `true`."
          },
          "currency": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax amount currency (ISO 4217). Required unless `logic` is `percent` — also when an update changes `logic` to a fixed amount — and null when it is."
          },
          "skip_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Count of nights skipped at tax calculation — for long-stay taxes applied from the Nth night. `null` when not set."
          },
          "max_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum count of nights used as the taxable base — for taxes applied only to the first N nights. `null` when not set."
          },
          "applicable_after": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy start date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "applicable_before": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy end date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "rate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Tax amount. A percentage greater than 0 and at most 100 when `logic` is `percent`; a fixed amount greater than 0 in `currency` otherwise.",
            "examples": [
              "20.00"
            ]
          },
          "applicable_date_ranges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Taxes.TaxApplicableDateRange"
            },
            "maxItems": 20,
            "description": "Stay-date ranges the tax applies within (up to 20). Empty when the tax applies on every date."
          },
          "taxes": {
            "description": "Sub-taxes calculated on deeper levels underneath this tax. Empty when the taxes were listed flat.",
            "examples": [
              []
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxSets.TaxSetTax"
            }
          },
          "level": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Calculation-order level. Levels are processed from the deepest (highest number) to the top (`0`); a tax is calculated on the night price plus every amount from the levels deeper than its own.",
            "examples": [
              0
            ]
          }
        },
        "description": "A tax embedded in a Tax Set response: the tax read attributes plus nesting and calculation order."
      },
      "TaxSets.TaxSetTaxWrite": {
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Tax UUID."
          },
          "level": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Calculation-order level, `0` when omitted. Levels are processed from the deepest (highest number) to the top (`0`): a tax at level 0 is calculated on the night price plus every amount from levels 1 and deeper, and so on. Taxes on the same level are calculated on the same base."
          },
          "taxes": {
            "description": "Sub-taxes to calculate on a deeper level underneath this tax. An alternative to listing every tax flat with its `level`: both forms calculate the same, and the response keeps the form sent.",
            "examples": [
              []
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxSets.TaxSetTaxWrite"
            }
          }
        },
        "description": "A tax reference within a Tax Set create/update request."
      },
      "TaxSets.TaxSetTestCalculation": {
        "type": "object",
        "required": [
          "taxes",
          "currency",
          "date",
          "days"
        ],
        "properties": {
          "taxes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxSets.TaxSetTestTax"
            },
            "description": "Taxes to calculate, by reference to persisted taxes. A tax whose `applicable_date_ranges` do not cover the stay is left out of the result.",
            "examples": [
              [
                {
                  "id": "d719deab-53d7-465a-85d2-bea74f7add47",
                  "level": 0
                }
              ]
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Price currency (ISO 4217)."
          },
          "date": {
            "type": "string",
            "format": "date",
            "description": "Stay start date (ISO 8601 `YYYY-MM-DD`); the nights in `days` follow it."
          },
          "days": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Per-night prices as decimal strings, one entry per stay night. Numbers are refused.",
            "examples": [
              [
                "100.00"
              ]
            ]
          }
        },
        "description": "The calculation a preview describes: taxes (by reference to persisted taxes) applied to a stay priced per night."
      },
      "TaxSets.TaxSetTestRequest": {
        "type": "object",
        "required": [
          "test"
        ],
        "properties": {
          "test": {
            "$ref": "#/components/schemas/TaxSets.TaxSetTestCalculation"
          }
        },
        "description": "Request body accepted by the tax calculation preview."
      },
      "TaxSets.TaxSetTestResults": {
        "type": "object",
        "required": [
          "taxes",
          "total_price",
          "net_price"
        ],
        "properties": {
          "taxes": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "string"
            },
            "description": "Calculated tax amounts (decimal strings) keyed by tax title — only the taxes that applied to the stay.",
            "examples": [
              {
                "20% VAT": "16.67"
              }
            ]
          },
          "total_price": {
            "type": "string",
            "description": "Price including inclusive taxes and every tax added on top.",
            "examples": [
              "100.00"
            ]
          },
          "net_price": {
            "type": "string",
            "description": "Price with all taxes excluded.",
            "examples": [
              "83.33"
            ]
          }
        },
        "description": "Attributes of a tax calculation preview result."
      },
      "TaxSets.TaxSetTestResultsResource": {
        "type": "object",
        "required": [
          "type",
          "attributes"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "tax_set_test_results"
            ]
          },
          "attributes": {
            "$ref": "#/components/schemas/TaxSets.TaxSetTestResults"
          }
        },
        "description": "Result of a tax calculation preview. Carries attributes only — no `id` or relationships."
      },
      "TaxSets.TaxSetTestTax": {
        "type": "object",
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of a persisted tax to include."
          },
          "level": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Calculation-order level, `0` when omitted. Levels are processed from the deepest (highest number) to the top (`0`).",
            "default": 0
          },
          "taxes": {
            "description": "Sub-taxes to calculate on a deeper level underneath this tax.",
            "examples": [
              []
            ],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxSets.TaxSetTestTax"
            }
          }
        },
        "description": "A reference to a persisted tax to include in a test calculation, with its calculation-order level and sub-taxes."
      },
      "TaxSets.TaxSetUpdate": {
        "type": "object",
        "required": [
          "taxes"
        ],
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Tax set title.",
            "examples": [
              "Tax Set Title"
            ]
          },
          "currency": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              }
            ],
            "description": "Tax set currency (ISO 4217). An unknown code answers 422."
          },
          "associated_rate_plan_ids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Common.Scalars.id"
            },
            "description": "Rate Plans the set applies to. On write, each listed Rate Plan gets this set as its `tax_set_id` — a Rate Plan has one set at a time, so it leaves the set it had; `[]` detaches every Rate Plan, and a detached Rate Plan falls back to the property's default set. Every response carries the current list, `[]` when none."
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the tax set belongs to. The first Tax Set created for a Property automatically becomes its default tax set. On update, a different Property moves the set to it."
          },
          "taxes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaxSets.TaxSetTaxWrite"
            },
            "description": "Taxes the set holds after the update, by reference. Required. Send an empty list to leave the set without taxes."
          }
        },
        "description": "Tax Set attributes accepted when updating a tax set. `taxes` must be sent on every update — it replaces the set's taxes. Every other attribute is optional and left unchanged when absent."
      },
      "TaxSets.TaxSetUpdateRequest": {
        "type": "object",
        "required": [
          "tax_set"
        ],
        "properties": {
          "tax_set": {
            "$ref": "#/components/schemas/TaxSets.TaxSetUpdate"
          }
        },
        "description": "Request body accepted when updating a tax set."
      },
      "Taxes.Tax": {
        "type": "object",
        "required": [
          "id",
          "title",
          "logic",
          "type",
          "is_inclusive",
          "currency",
          "skip_nights",
          "max_nights",
          "applicable_after",
          "applicable_before",
          "rate",
          "applicable_date_ranges"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique tax identifier.",
            "examples": [
              "6d30137e-74a1-41f6-aa96-2c0371e94dbf"
            ]
          },
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Tax title.",
            "examples": [
              "10% VAT"
            ]
          },
          "logic": {
            "$ref": "#/components/schemas/Taxes.TaxLogic"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Taxes.TaxType"
              }
            ],
            "description": "Kind of charge the tax represents. Defaults to `tax`."
          },
          "is_inclusive": {
            "type": "boolean",
            "description": "Whether the tax is included in the room price (`true`) or added on top (`false`). Defaults to `true`."
          },
          "currency": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax amount currency (ISO 4217). Required unless `logic` is `percent` — also when an update changes `logic` to a fixed amount — and null when it is."
          },
          "skip_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Count of nights skipped at tax calculation — for long-stay taxes applied from the Nth night. `null` when not set."
          },
          "max_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum count of nights used as the taxable base — for taxes applied only to the first N nights. `null` when not set."
          },
          "applicable_after": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy start date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "applicable_before": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy end date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "rate": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              }
            ],
            "description": "Tax amount. A percentage greater than 0 and at most 100 when `logic` is `percent`; a fixed amount greater than 0 in `currency` otherwise.",
            "examples": [
              "20.00"
            ]
          },
          "applicable_date_ranges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Taxes.TaxApplicableDateRange"
            },
            "maxItems": 20,
            "description": "Stay-date ranges the tax applies within (up to 20). Empty when the tax applies on every date."
          }
        },
        "description": "A tax as returned in responses: every attribute is present."
      },
      "Taxes.TaxApplicableDateRange": {
        "type": "object",
        "required": [
          "after",
          "before"
        ],
        "properties": {
          "after": {
            "type": "string",
            "format": "date",
            "description": "First date the tax applies."
          },
          "before": {
            "type": "string",
            "format": "date",
            "description": "Last date the tax applies."
          }
        },
        "description": "A range of stay dates the tax applies within (inclusive ISO 8601 `YYYY-MM-DD` bounds)."
      },
      "Taxes.TaxCreate": {
        "type": "object",
        "required": [
          "title",
          "logic",
          "property_id",
          "rate"
        ],
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Tax title.",
            "examples": [
              "10% VAT"
            ]
          },
          "logic": {
            "$ref": "#/components/schemas/Taxes.TaxLogic"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Taxes.TaxType"
              }
            ],
            "description": "Kind of charge the tax represents. Defaults to `tax`."
          },
          "is_inclusive": {
            "type": "boolean",
            "description": "Whether the tax is included in the room price (`true`) or added on top (`false`). Defaults to `true`."
          },
          "currency": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax amount currency (ISO 4217). Required unless `logic` is `percent` — also when an update changes `logic` to a fixed amount — and null when it is."
          },
          "skip_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Count of nights skipped at tax calculation — for long-stay taxes applied from the Nth night. `null` when not set."
          },
          "max_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum count of nights used as the taxable base — for taxes applied only to the first N nights. `null` when not set."
          },
          "applicable_after": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy start date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "applicable_before": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy end date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the tax belongs to. Fixed at creation: a different value on update is ignored."
          },
          "rate": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "number"
              }
            ],
            "description": "Tax amount: a decimal string like `\"20.00\"`, or a number. A percentage greater than 0 and at most 100 when `logic` is `percent`; a fixed amount greater than 0 in `currency` otherwise.",
            "examples": [
              "20.00"
            ]
          },
          "applicable_date_ranges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Taxes.TaxApplicableDateRange"
            },
            "maxItems": 20,
            "description": "Stay-date ranges the tax applies within (up to 20) — e.g. a seasonal tourist tax. Each range needs both bounds, with `after` on or before `before`; ranges may overlap. Omit to apply on every date."
          }
        },
        "description": "Tax attributes accepted when creating a tax."
      },
      "Taxes.TaxCreateRequest": {
        "type": "object",
        "required": [
          "tax"
        ],
        "properties": {
          "tax": {
            "$ref": "#/components/schemas/Taxes.TaxCreate"
          }
        },
        "description": "Request body accepted when creating a tax."
      },
      "Taxes.TaxLogic": {
        "type": "string",
        "enum": [
          "percent",
          "per_room",
          "per_room_per_night",
          "per_person",
          "per_person_per_night",
          "per_night",
          "per_booking"
        ],
        "description": "How the tax amount is calculated."
      },
      "Taxes.TaxRelationships": {
        "type": "object",
        "required": [
          "property"
        ],
        "properties": {
          "property": {
            "type": "object",
            "properties": {
              "data": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Common.Scalars.id"
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "property"
                    ]
                  }
                },
                "required": [
                  "id",
                  "type"
                ]
              }
            },
            "required": [
              "data"
            ],
            "description": "Property the tax belongs to."
          }
        },
        "description": "Relationships of a tax resource."
      },
      "Taxes.TaxResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "tax"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Taxes.Tax"
          },
          "relationships": {
            "$ref": "#/components/schemas/Taxes.TaxRelationships"
          }
        },
        "description": "A tax as returned in responses."
      },
      "Taxes.TaxType": {
        "type": "string",
        "enum": [
          "tax",
          "fee",
          "city_tax"
        ],
        "description": "Kind of charge the tax represents."
      },
      "Taxes.TaxUpdate": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "maxLength": 255,
            "description": "Tax title.",
            "examples": [
              "10% VAT"
            ]
          },
          "logic": {
            "$ref": "#/components/schemas/Taxes.TaxLogic"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Taxes.TaxType"
              }
            ],
            "description": "Kind of charge the tax represents. Defaults to `tax`."
          },
          "is_inclusive": {
            "type": "boolean",
            "description": "Whether the tax is included in the room price (`true`) or added on top (`false`). Defaults to `true`."
          },
          "currency": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.currency"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tax amount currency (ISO 4217). Required unless `logic` is `percent` — also when an update changes `logic` to a fixed amount — and null when it is."
          },
          "skip_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Count of nights skipped at tax calculation — for long-stay taxes applied from the Nth night. `null` when not set."
          },
          "max_nights": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.positiveInt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum count of nights used as the taxable base — for taxes applied only to the first N nights. `null` when not set."
          },
          "applicable_after": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy start date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "applicable_before": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ],
            "description": "Legacy end date of a single applicability range. Sending `applicable_after` or `applicable_before` replaces `applicable_date_ranges` with that one range; both are `null` when the ranges were set through `applicable_date_ranges`.",
            "deprecated": true
          },
          "property_id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "UUID of the Property the tax belongs to. Fixed at creation: a different value on update is ignored."
          },
          "rate": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.decimalString"
              },
              {
                "type": "number"
              }
            ],
            "description": "Tax amount: a decimal string like `\"20.00\"`, or a number. A percentage greater than 0 and at most 100 when `logic` is `percent`; a fixed amount greater than 0 in `currency` otherwise.",
            "examples": [
              "20.00"
            ]
          },
          "applicable_date_ranges": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Taxes.TaxApplicableDateRange"
            },
            "maxItems": 20,
            "description": "Stay-date ranges the tax applies within (up to 20) — e.g. a seasonal tourist tax. Each range needs both bounds, with `after` on or before `before`; ranges may overlap. Omit to apply on every date."
          }
        },
        "description": "Tax attributes accepted when updating a tax. Every attribute is optional; attributes absent from the request are left unchanged. `applicable_date_ranges` replaces the stored ranges (`[]` clears them); `property_id` cannot be changed."
      },
      "Taxes.TaxUpdateRequest": {
        "type": "object",
        "required": [
          "tax"
        ],
        "properties": {
          "tax": {
            "$ref": "#/components/schemas/Taxes.TaxUpdate"
          }
        },
        "description": "Request body accepted when updating a tax."
      },
      "Webhooks.EmbeddedWebhookBillingAccount": {
        "type": "object",
        "required": [
          "id",
          "type"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "billing_account"
            ]
          }
        },
        "description": "The billing account a webhook belongs to."
      },
      "Webhooks.EmbeddedWebhookOrganization": {
        "type": "object",
        "required": [
          "id",
          "type"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "organization"
            ]
          }
        },
        "description": "The organization a webhook belongs to."
      },
      "Webhooks.EmbeddedWebhookProperty": {
        "type": "object",
        "required": [
          "id",
          "type"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "type": {
            "type": "string",
            "enum": [
              "property"
            ]
          }
        },
        "description": "The property a webhook belongs to."
      },
      "Webhooks.EventMask": {
        "type": "string",
        "description": "Event mask. Use `*` for every event, or a semicolon-separated list of event names,\ne.g. `booking_new;booking_modification;booking_cancellation`. An unknown name\nrejects the request, naming it.",
        "examples": [
          "booking_new;booking_modification;booking_cancellation"
        ]
      },
      "Webhooks.Webhook": {
        "type": "object",
        "required": [
          "id",
          "protected",
          "callback_url",
          "event_mask",
          "request_params",
          "headers",
          "is_active",
          "send_data",
          "is_global",
          "is_signed",
          "signing_key_id"
        ],
        "properties": {
          "id": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              }
            ],
            "description": "Unique webhook identifier. Mirrors the top-level resource `id`.",
            "examples": [
              "058457e7-b76c-4654-9228-ec8395b0121b"
            ]
          },
          "activity": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Webhooks.WebhookActivity"
              }
            ],
            "description": "Delivery activity statistics, test deliveries not counted. Returned by the list endpoint only, and only for some authentication types."
          },
          "protected": {
            "type": "boolean",
            "description": "Whether the webhook is managed by Channex. Set on the webhooks created for you when you\ninstall an integration app; a protected webhook cannot be updated or deleted through\nthis API. `false` for a webhook you create yourself.",
            "examples": [
              false
            ]
          },
          "callback_url": {
            "type": "string",
            "format": "uri",
            "description": "URL called via POST when a subscribed trigger event occurs. Must carry a scheme and a resolvable host.",
            "examples": [
              "https://your-website.com/api/push_message"
            ]
          },
          "event_mask": {
            "$ref": "#/components/schemas/Webhooks.EventMask"
          },
          "request_params": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Additional GET query parameters appended to the callback request, or null when none are set."
          },
          "headers": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Custom request headers for the callback request, or null when none are set. Use this\nto authenticate against a protected endpoint, e.g.\n`{ \"Authorization\": \"Basic user:password\" }`."
          },
          "is_active": {
            "type": "boolean",
            "description": "Whether the webhook is active. Only active webhooks receive notifications. `false` by default.",
            "examples": [
              true
            ]
          },
          "send_data": {
            "type": "boolean",
            "description": "Whether to include event payload data in the callback. When `false`, the delivery\ncarries `event`, `property_id`, `user_id` and `timestamp` and no `payload`. `false`\nby default.",
            "examples": [
              true
            ]
          },
          "is_global": {
            "type": "boolean",
            "description": "Whether the webhook receives events from every property of the billing account rather\nthan from one. `false` by default, and fixed after creation: a property-level webhook\ncannot be converted to a global one.\n\nA global and a property-level webhook can cover the same event. When they point at\ndifferent callback URLs both are delivered; when they point at the same one the\ndelivery is made once, with the property-level webhook's settings.",
            "examples": [
              false
            ]
          },
          "is_signed": {
            "type": "boolean",
            "description": "Whether deliveries are signed. When `true`, every callback request carries the\n`x-hmac-timestamp`, `x-hmac-signature-256` and `x-hmac-keys-256` headers, computed\nwith the key referenced by `signing_key_id`. The Webhook Signing Keys resource\ndescribes the signed string and how to verify a delivery. `false` by default.",
            "examples": [
              false
            ]
          },
          "signing_key_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the signing key deliveries are signed with, or null when none is assigned.\nRequired whenever `is_signed` is true; the key must belong to a billing account the\ncaller is a member of. Responses also expose the key, with its masked versions,\nthrough the `signing_key` relationship."
          }
        },
        "description": "A webhook subscription: a callback URL notified when subscribed events occur."
      },
      "Webhooks.WebhookActivity": {
        "type": "object",
        "required": [
          "deliveries",
          "last_attempt",
          "series"
        ],
        "properties": {
          "deliveries": {
            "type": "object",
            "properties": {
              "response_time": {
                "type": "object",
                "properties": {
                  "p95_ms": {
                    "anyOf": [
                      {
                        "type": "number",
                        "format": "double"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "95th percentile response time in milliseconds. Null when no deliveries have been recorded.",
                    "examples": [
                      125.4
                    ]
                  }
                },
                "required": [
                  "p95_ms"
                ]
              },
              "success_count": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                  }
                ],
                "description": "Number of successful deliveries.",
                "examples": [
                  0
                ]
              },
              "failed_count": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                  }
                ],
                "description": "Number of failed deliveries.",
                "examples": [
                  0
                ]
              }
            },
            "required": [
              "response_time",
              "success_count",
              "failed_count"
            ],
            "description": "Aggregated delivery counters and response-time statistics."
          },
          "last_attempt": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Webhooks.WebhookLastAttempt"
              },
              {
                "type": "null"
              }
            ],
            "description": "Details of the last delivery attempt. Null when no attempts have been made."
          },
          "series": {
            "type": "object",
            "properties": {
              "timestamp": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "format": "int64"
                },
                "description": "Unix epoch timestamps (seconds) for each data point in the series."
              },
              "success": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                },
                "description": "Successful delivery counts per timestamp."
              },
              "failed": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
                },
                "description": "Failed delivery counts per timestamp."
              }
            },
            "required": [
              "timestamp",
              "success",
              "failed"
            ],
            "description": "Time series of delivery counts. The three arrays are parallel and indexed by `timestamp`."
          }
        },
        "description": "Delivery activity statistics for a webhook."
      },
      "Webhooks.WebhookCreate": {
        "type": "object",
        "required": [
          "callback_url",
          "event_mask"
        ],
        "properties": {
          "callback_url": {
            "type": "string",
            "format": "uri",
            "description": "URL called via POST when a subscribed trigger event occurs. Must carry a scheme and a resolvable host.",
            "examples": [
              "https://your-website.com/api/push_message"
            ]
          },
          "event_mask": {
            "$ref": "#/components/schemas/Webhooks.EventMask"
          },
          "request_params": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Additional GET query parameters appended to the callback request, or null when none are set."
          },
          "headers": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Custom request headers for the callback request, or null when none are set. Use this\nto authenticate against a protected endpoint, e.g.\n`{ \"Authorization\": \"Basic user:password\" }`."
          },
          "is_active": {
            "type": "boolean",
            "description": "Whether the webhook is active. Only active webhooks receive notifications. `false` by default.",
            "examples": [
              true
            ]
          },
          "send_data": {
            "type": "boolean",
            "description": "Whether to include event payload data in the callback. When `false`, the delivery\ncarries `event`, `property_id`, `user_id` and `timestamp` and no `payload`. `false`\nby default.",
            "examples": [
              true
            ]
          },
          "is_global": {
            "type": "boolean",
            "description": "Whether the webhook receives events from every property of the billing account rather\nthan from one. `false` by default, and fixed after creation: a property-level webhook\ncannot be converted to a global one.\n\nA global and a property-level webhook can cover the same event. When they point at\ndifferent callback URLs both are delivered; when they point at the same one the\ndelivery is made once, with the property-level webhook's settings.",
            "examples": [
              false
            ]
          },
          "is_signed": {
            "type": "boolean",
            "description": "Whether deliveries are signed. When `true`, every callback request carries the\n`x-hmac-timestamp`, `x-hmac-signature-256` and `x-hmac-keys-256` headers, computed\nwith the key referenced by `signing_key_id`. The Webhook Signing Keys resource\ndescribes the signed string and how to verify a delivery. `false` by default.",
            "examples": [
              false
            ]
          },
          "signing_key_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the signing key deliveries are signed with, or null when none is assigned.\nRequired whenever `is_signed` is true; the key must belong to a billing account the\ncaller is a member of. Responses also expose the key, with its masked versions,\nthrough the `signing_key` relationship."
          },
          "property_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property to associate the webhook with. Required unless `is_global` is\ntrue; a request that omits both answers `422`.",
            "examples": [
              "716305c4-561a-4561-a187-7f5b8aeb5920"
            ]
          }
        },
        "description": "Attributes accepted when creating a webhook."
      },
      "Webhooks.WebhookCreateRequest": {
        "type": "object",
        "required": [
          "webhook"
        ],
        "properties": {
          "webhook": {
            "$ref": "#/components/schemas/Webhooks.WebhookCreate"
          }
        },
        "description": "Request body accepted when creating a webhook."
      },
      "Webhooks.WebhookEvent": {
        "type": "string",
        "enum": [
          "ari",
          "booking",
          "booking_new",
          "booking_modification",
          "booking_cancellation",
          "booking_unmapped_room",
          "booking_unmapped_rate",
          "non_acked_booking",
          "message",
          "sync_error",
          "sync_warning",
          "rate_error",
          "reservation_request",
          "alteration_request",
          "accepted_reservation",
          "declined_reservation",
          "inquiry",
          "review",
          "updated_review",
          "published_review",
          "new_channel",
          "updated_channel",
          "disconnect_channel",
          "disconnect_listing",
          "activate_channel",
          "deactivate_channel",
          "channel_removal_warning",
          "property_removal_warning",
          "message_thread_booking_assigned",
          "booking_invalid_guarantee",
          "airbnb_notification"
        ],
        "description": "Webhook event types that can trigger a push notification."
      },
      "Webhooks.WebhookEvents": {
        "type": "object",
        "required": [
          "events"
        ],
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Webhooks.WebhookEvent"
            }
          }
        },
        "description": "The webhook event types available for subscription."
      },
      "Webhooks.WebhookHmac": {
        "type": "object",
        "required": [
          "signatures",
          "signing_keys",
          "timestamp"
        ],
        "properties": {
          "signatures": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Lowercase-hex HMAC-SHA256 signatures sent, the current key's first."
          },
          "signing_keys": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Masked labels (`...` + last 6 of the secret) of the signing key versions used, in the same order.",
            "examples": [
              [
                "...4f9c2a"
              ]
            ]
          },
          "timestamp": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int64"
              },
              {
                "type": "null"
              }
            ],
            "description": "Unix-seconds timestamp of the signing string, as sent in `x-hmac-timestamp`.",
            "examples": [
              1758100512
            ]
          }
        },
        "description": "HMAC facts of a signed request: what was sent in the `x-hmac-*` headers,\nbroken out per signing key version."
      },
      "Webhooks.WebhookLastAttempt": {
        "type": "object",
        "required": [
          "error",
          "success",
          "status_code",
          "attempted_at"
        ],
        "properties": {
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Error reason when the attempt failed (e.g. `timeout`, `proxy_error`), or null on success.",
            "examples": [
              "timeout"
            ]
          },
          "success": {
            "type": "boolean",
            "description": "Whether the delivery attempt succeeded.",
            "examples": [
              true
            ]
          },
          "status_code": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "HTTP status code returned by the callback URL. Null when the request failed before a response was received (e.g. timeout or proxy error).",
            "examples": [
              200
            ]
          },
          "attempted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the attempt was made (ISO 8601, no timezone offset).",
            "examples": [
              "2026-06-17T02:56:37.717460"
            ]
          }
        },
        "description": "Details of the most recent webhook delivery attempt."
      },
      "Webhooks.WebhookRelationships": {
        "type": "object",
        "required": [
          "billing_account",
          "organization"
        ],
        "properties": {
          "property": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/Webhooks.EmbeddedWebhookProperty"
              }
            },
            "required": [
              "data"
            ],
            "description": "The property the webhook watches. Absent for a global webhook."
          },
          "billing_account": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/Webhooks.EmbeddedWebhookBillingAccount"
              }
            },
            "required": [
              "data"
            ],
            "description": "The billing account the webhook belongs to."
          },
          "organization": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/Webhooks.EmbeddedWebhookOrganization"
              }
            },
            "required": [
              "data"
            ],
            "description": "The organization the webhook belongs to."
          },
          "signing_key": {
            "type": "object",
            "properties": {
              "data": {
                "$ref": "#/components/schemas/SigningKeys.SigningKeyResource"
              }
            },
            "required": [
              "data"
            ],
            "description": "The signing key deliveries are signed with, with its versions masked. Absent when no key is assigned."
          }
        },
        "description": "Relationships of a webhook: the property it watches, and the account it belongs to."
      },
      "Webhooks.WebhookResource": {
        "type": "object",
        "required": [
          "type",
          "id",
          "attributes",
          "relationships"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "webhook"
            ]
          },
          "id": {
            "$ref": "#/components/schemas/Common.Scalars.id"
          },
          "attributes": {
            "$ref": "#/components/schemas/Webhooks.Webhook"
          },
          "relationships": {
            "$ref": "#/components/schemas/Webhooks.WebhookRelationships"
          }
        },
        "description": "A webhook resource: the subscription attributes plus the property and account it belongs to."
      },
      "Webhooks.WebhookTestDelivery": {
        "type": "object",
        "required": [
          "id",
          "webhook_id",
          "property_id",
          "event",
          "is_test",
          "success",
          "status_code",
          "error",
          "response_time",
          "attempt",
          "is_signed",
          "callback_url",
          "payload",
          "request_headers",
          "response_headers",
          "response",
          "user_id",
          "started_at",
          "finished_at",
          "inserted_at"
        ],
        "properties": {
          "id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "Identifier the entry gets once stored. Null in the test response."
          },
          "webhook_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the tested webhook. Null for the callback-URL test, which is bound to no webhook."
          },
          "property_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property associated with the tested webhook. Null for the callback-URL test and for a global webhook."
          },
          "event": {
            "type": "string",
            "enum": [
              "test"
            ],
            "description": "Always `test`."
          },
          "is_test": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "Always `true`: the entry was written by a test, not by a live delivery."
          },
          "success": {
            "type": "boolean",
            "description": "Whether the test delivery succeeded.",
            "examples": [
              true
            ]
          },
          "status_code": {
            "anyOf": [
              {
                "type": "integer",
                "format": "int32"
              },
              {
                "type": "null"
              }
            ],
            "description": "HTTP status code returned by the callback URL. Null when no response was received."
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Failure reason (e.g. `timeout`), or null on success."
          },
          "response_time": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Delivery round-trip time in milliseconds.",
            "examples": [
              583
            ]
          },
          "attempt": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.nonNegativeInt"
              }
            ],
            "description": "Always `0`: a test is never retried."
          },
          "is_signed": {
            "type": "boolean",
            "description": "Whether the test request was HMAC-signed."
          },
          "hmac": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Webhooks.WebhookHmac"
              }
            ],
            "description": "HMAC facts of the test request. Omitted when unsigned."
          },
          "callback_url": {
            "type": "string",
            "format": "uri",
            "description": "Callback URL the test request was sent to.",
            "examples": [
              "https://your-website.com/api/push_message"
            ]
          },
          "payload": {
            "type": "string",
            "description": "Serialized JSON payload of the test: always the standard test body — a `payload`\ngiven in the request is ignored. The delivered body omits it when `send_data` is\nfalse.",
            "examples": [
              "{\"hello\":\"world\"}"
            ]
          },
          "request_headers": {
            "type": "string",
            "description": "Serialized JSON request headers sent with the test request.",
            "examples": [
              "{\"Content-type\":\"application/json\"}"
            ]
          },
          "response_headers": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Serialized JSON response headers returned by the callback URL. Null when no response was received."
          },
          "response": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Response body returned by the callback URL, or the failure reason."
          },
          "user_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the user who ran the test. Null when it was run by the system."
          },
          "started_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the test attempt started (ISO 8601, no timezone offset).",
            "examples": [
              "2026-09-23T14:09:24.058655"
            ]
          },
          "finished_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the test attempt finished (ISO 8601, no timezone offset).",
            "examples": [
              "2026-09-23T14:09:24.641801"
            ]
          },
          "inserted_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the entry was written (ISO 8601, no timezone offset).",
            "examples": [
              "2026-09-23T14:09:24.641801"
            ]
          }
        },
        "description": "A webhook test attempt in the shape of a delivery log entry."
      },
      "Webhooks.WebhookTestResult": {
        "type": "object",
        "required": [
          "request_url",
          "status",
          "headers",
          "body",
          "is_signed",
          "delivery"
        ],
        "properties": {
          "request_url": {
            "type": "string",
            "description": "URL the test request was sent to.",
            "examples": [
              "https://your-website.com/api/push_message"
            ]
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "description": "HTTP status code returned by the callback URL. `0` when no response was received (timeout or connection failure); `body` then carries the reason.",
            "examples": [
              405
            ]
          },
          "headers": {
            "type": "object",
            "unevaluatedProperties": {
              "type": "string"
            },
            "description": "Response headers returned by the callback URL, lower-cased.",
            "examples": [
              {
                "content-type": "application/json"
              }
            ]
          },
          "body": {
            "type": "string",
            "description": "Response body returned by the callback URL, as text.",
            "examples": [
              "{\n  \"success\": true\n}"
            ]
          },
          "is_signed": {
            "type": "boolean",
            "description": "Whether the test request was HMAC-signed.",
            "examples": [
              true
            ]
          },
          "hmac": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Webhooks.WebhookHmac"
              }
            ],
            "description": "HMAC facts of the test request: the signatures, key labels and timestamp sent. Omitted when unsigned."
          },
          "delivery": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Webhooks.WebhookTestDelivery"
              }
            ],
            "description": "The test attempt described as a webhook delivery log entry."
          }
        },
        "description": "Result of a webhook test: what the target callback URL answered."
      },
      "Webhooks.WebhookUpdate": {
        "type": "object",
        "properties": {
          "callback_url": {
            "type": "string",
            "format": "uri",
            "description": "URL called via POST when a subscribed trigger event occurs. Must carry a scheme and a resolvable host.",
            "examples": [
              "https://your-website.com/api/push_message"
            ]
          },
          "event_mask": {
            "$ref": "#/components/schemas/Webhooks.EventMask"
          },
          "request_params": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Additional GET query parameters appended to the callback request, or null when none are set."
          },
          "headers": {
            "anyOf": [
              {
                "type": "object",
                "unevaluatedProperties": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Custom request headers for the callback request, or null when none are set. Use this\nto authenticate against a protected endpoint, e.g.\n`{ \"Authorization\": \"Basic user:password\" }`."
          },
          "is_active": {
            "type": "boolean",
            "description": "Whether the webhook is active. Only active webhooks receive notifications. `false` by default.",
            "examples": [
              true
            ]
          },
          "send_data": {
            "type": "boolean",
            "description": "Whether to include event payload data in the callback. When `false`, the delivery\ncarries `event`, `property_id`, `user_id` and `timestamp` and no `payload`. `false`\nby default.",
            "examples": [
              true
            ]
          },
          "is_global": {
            "type": "boolean",
            "description": "Whether the webhook receives events from every property of the billing account rather\nthan from one. `false` by default, and fixed after creation: a property-level webhook\ncannot be converted to a global one.\n\nA global and a property-level webhook can cover the same event. When they point at\ndifferent callback URLs both are delivered; when they point at the same one the\ndelivery is made once, with the property-level webhook's settings.",
            "examples": [
              false
            ]
          },
          "is_signed": {
            "type": "boolean",
            "description": "Whether deliveries are signed. When `true`, every callback request carries the\n`x-hmac-timestamp`, `x-hmac-signature-256` and `x-hmac-keys-256` headers, computed\nwith the key referenced by `signing_key_id`. The Webhook Signing Keys resource\ndescribes the signed string and how to verify a delivery. `false` by default.",
            "examples": [
              false
            ]
          },
          "signing_key_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the signing key deliveries are signed with, or null when none is assigned.\nRequired whenever `is_signed` is true; the key must belong to a billing account the\ncaller is a member of. Responses also expose the key, with its masked versions,\nthrough the `signing_key` relationship."
          },
          "property_id": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Common.Scalars.id"
              },
              {
                "type": "null"
              }
            ],
            "description": "UUID of the property to associate the webhook with. Required unless `is_global` is\ntrue; a request that omits both answers `422`.",
            "examples": [
              "716305c4-561a-4561-a187-7f5b8aeb5920"
            ]
          }
        },
        "description": "Attributes accepted when updating a webhook. Every attribute is optional; attributes absent from the request are left unchanged."
      },
      "Webhooks.WebhookUpdateRequest": {
        "type": "object",
        "required": [
          "webhook"
        ],
        "properties": {
          "webhook": {
            "$ref": "#/components/schemas/Webhooks.WebhookUpdate"
          }
        },
        "description": "Request body accepted when updating a webhook, and when testing a callback URL."
      }
    },
    "securitySchemes": {
      "UserApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "user-api-key",
        "description": "API key for programmatic access, sent in the `user-api-key` header."
      }
    }
  },
  "servers": [
    {
      "url": "https://app.channex.io/api/v1",
      "description": "Production server",
      "variables": {}
    },
    {
      "url": "https://staging.channex.io/api/v1",
      "description": "Staging server",
      "variables": {}
    }
  ]
}
