> For the complete documentation index, see [llms.txt](https://mobile-calendar.gitbook.io/v1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mobile-calendar.gitbook.io/v1/rest-api/property.md).

# Property

Property (hotel/object) data, regulations and privacy policy.

## Get property data

> Returns the property (hotel/object) data: name, address, check-in/check-out hours, contact, map position and logo. 404 when the account has not set up the property yet (use PUT /property). Required scope: \`property.read\`.

```json
{"openapi":"3.0.0","info":{"title":"Public REST API v1 – mobile-calendar.com","version":"1.0.0"},"tags":[{"name":"property","description":"Property (hotel/object) data, regulations and privacy policy."}],"servers":[{"url":"https://api.mobile-calendar.com/v1/public","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","description":"Pass the token in header: Authorization: Bearer <JWT>","bearerFormat":"JWT","scheme":"bearer"}},"schemas":{"PropertyResponse":{"description":"Property data with metadata","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/PropertyEntry"},"meta":{"$ref":"#/components/schemas/MetaWithRuid"}},"type":"object"},"PropertyEntry":{"description":"Property (hotel/object) data shown to guests: name, address, check-in/check-out hours, contact, map position and logo. One property per account. Read-only: `objectId`, `countryName`, `logoUrl` (the logo is uploaded in the panel).","required":["objectId","objectName","checkIn","checkOut","email","webPage","phonePrefix","phoneCountry","phone","noStreetAddress","street","postalCode","city","countryId","countryName","latitude","longitude","placeId","logoUrl"],"properties":{"objectId":{"type":"integer"},"objectName":{"type":"string","maxLength":200},"checkIn":{"description":"Check-in from (HH:MM).","type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"checkOut":{"description":"Check-out until (HH:MM).","type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"email":{"description":"Contact e-mail printed in confirmations and used as reply-to.","type":"string","format":"email"},"webPage":{"description":"Website; empty string = none.","type":"string","maxLength":255},"phonePrefix":{"type":"string"},"phoneCountry":{"type":"string"},"phone":{"type":"string","maxLength":30},"noStreetAddress":{"description":"Property has no street address (e.g. rural location) — `street` is then empty.","type":"boolean"},"street":{"type":"string","maxLength":200},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":100},"countryId":{"description":"Country ID (177 = Poland, 83 = Germany).","type":"integer","minimum":0},"countryName":{"type":"string","nullable":true},"latitude":{"description":"Map position; null when not set.","type":"number","format":"double","nullable":true},"longitude":{"type":"number","format":"double","nullable":true},"placeId":{"description":"Google Places ID of the property; null when not set.","type":"string","maxLength":100,"nullable":true},"logoUrl":{"description":"Logo URL (read-only; uploaded in the panel).","type":"string","nullable":true}},"type":"object"},"MetaWithRuid":{"description":"Metadata with request tracking.","required":["ruid"],"properties":{"ruid":{"description":"Request Unique ID","type":"string","format":"uuid"}},"type":"object"},"ApiProblem401":{"description":"Missing authentication or invalid credentials.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"401 Unauthorized","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblemBase":{"description":"RFC 7807 Problem Details (base schema).","required":["type","title","status","detail","instance"],"properties":{"type":{"description":"RFC 7807 base — DO NOT use directly in endpoints.\nIn endpoints reference ApiProblem400/401/403/409/422/429/500.","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"},"ApiProblem403":{"description":"Authenticated user but no access.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"403 Forbidden","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblem404":{"description":"Resource specified in the request was not found.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"404 Not Found","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]}}},"paths":{"/property":{"get":{"tags":["property"],"summary":"Get property data","description":"Returns the property (hotel/object) data: name, address, check-in/check-out hours, contact, map position and logo. 404 when the account has not set up the property yet (use PUT /property). Required scope: `property.read`.","operationId":"getProperty","responses":{"200":{"description":"Property data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem401"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem403"}}}},"404":{"description":"Property not set up yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem404"}}}}}}}}}
```

## Create or update property data (full replacement)

> Replaces the property data (see PropertyUpdateRequest); creates it on first use (201). Omitted optional fields are cleared — read GET /property first and send the full object back. Rules: \`street\` is required unless \`noStreetAddress\` is true; \`latitude\` and \`longitude\` must be sent together (both or neither); \`countryId\` must be a valid country; \`checkIn\`/\`checkOut\` are HH:MM. Check-in/check-out hours, address and contact are shown to guests in confirmations, the booking engine and OTA listings; the logo can only be changed in the panel. Required scope: \`property.update\`.

```json
{"openapi":"3.0.0","info":{"title":"Public REST API v1 – mobile-calendar.com","version":"1.0.0"},"tags":[{"name":"property","description":"Property (hotel/object) data, regulations and privacy policy."}],"servers":[{"url":"https://api.mobile-calendar.com/v1/public","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","description":"Pass the token in header: Authorization: Bearer <JWT>","bearerFormat":"JWT","scheme":"bearer"}},"schemas":{"PropertyUpdateRequest":{"description":"Full replacement of the property data (PUT); creates the record on first use (201). `street` is required unless `noStreetAddress` is true. `latitude` and `longitude` must be sent together (both or neither). Read-only fields from GET (`objectId`, `countryName`, `logoUrl`) are ignored.","required":["objectName","checkIn","checkOut","email","phonePrefix","phoneCountry","phone","postalCode","city","countryId"],"properties":{"objectName":{"type":"string","maxLength":200},"checkIn":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"checkOut":{"type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"email":{"type":"string","format":"email","maxLength":254},"webPage":{"description":"Optional; with or without protocol.","type":"string","maxLength":255},"phonePrefix":{"type":"string","pattern":"^\\+\\d{1,4}$"},"phoneCountry":{"type":"string","pattern":"^[a-z]{2}$"},"phone":{"type":"string","maxLength":30},"noStreetAddress":{"type":"boolean","default":false},"street":{"type":"string","maxLength":200},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":100},"countryId":{"description":"Country ID (must exist).","type":"integer","minimum":1},"latitude":{"type":"number","format":"double","maximum":90,"minimum":-90,"nullable":true},"longitude":{"type":"number","format":"double","maximum":180,"minimum":-180,"nullable":true},"placeId":{"type":"string","maxLength":100,"nullable":true}},"type":"object"},"PropertyResponse":{"description":"Property data with metadata","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/PropertyEntry"},"meta":{"$ref":"#/components/schemas/MetaWithRuid"}},"type":"object"},"PropertyEntry":{"description":"Property (hotel/object) data shown to guests: name, address, check-in/check-out hours, contact, map position and logo. One property per account. Read-only: `objectId`, `countryName`, `logoUrl` (the logo is uploaded in the panel).","required":["objectId","objectName","checkIn","checkOut","email","webPage","phonePrefix","phoneCountry","phone","noStreetAddress","street","postalCode","city","countryId","countryName","latitude","longitude","placeId","logoUrl"],"properties":{"objectId":{"type":"integer"},"objectName":{"type":"string","maxLength":200},"checkIn":{"description":"Check-in from (HH:MM).","type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"checkOut":{"description":"Check-out until (HH:MM).","type":"string","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$"},"email":{"description":"Contact e-mail printed in confirmations and used as reply-to.","type":"string","format":"email"},"webPage":{"description":"Website; empty string = none.","type":"string","maxLength":255},"phonePrefix":{"type":"string"},"phoneCountry":{"type":"string"},"phone":{"type":"string","maxLength":30},"noStreetAddress":{"description":"Property has no street address (e.g. rural location) — `street` is then empty.","type":"boolean"},"street":{"type":"string","maxLength":200},"postalCode":{"type":"string","maxLength":20},"city":{"type":"string","maxLength":100},"countryId":{"description":"Country ID (177 = Poland, 83 = Germany).","type":"integer","minimum":0},"countryName":{"type":"string","nullable":true},"latitude":{"description":"Map position; null when not set.","type":"number","format":"double","nullable":true},"longitude":{"type":"number","format":"double","nullable":true},"placeId":{"description":"Google Places ID of the property; null when not set.","type":"string","maxLength":100,"nullable":true},"logoUrl":{"description":"Logo URL (read-only; uploaded in the panel).","type":"string","nullable":true}},"type":"object"},"MetaWithRuid":{"description":"Metadata with request tracking.","required":["ruid"],"properties":{"ruid":{"description":"Request Unique ID","type":"string","format":"uuid"}},"type":"object"},"ApiProblem400":{"description":"Request syntax/format error.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"400 Bad Request","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblemBase":{"description":"RFC 7807 Problem Details (base schema).","required":["type","title","status","detail","instance"],"properties":{"type":{"description":"RFC 7807 base — DO NOT use directly in endpoints.\nIn endpoints reference ApiProblem400/401/403/409/422/429/500.","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"},"ApiProblem401":{"description":"Missing authentication or invalid credentials.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"401 Unauthorized","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblem403":{"description":"Authenticated user but no access.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"403 Forbidden","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblem422":{"description":"Input data validation error.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"422 Unprocessable Entity (validation)","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"errors":{"description":"Map: field name → error message(s)","type":"object","additionalProperties":{"$ref":"#/components/schemas/ErrorValue"}}},"type":"object"}]},"ErrorValue":{"description":"Single error message or list of messages.","oneOf":[{"description":"Error value in error map can be:\n- single string, or\n- array of strings (multiple messages for one field).","type":"string"},{"type":"array","items":{"type":"string"}}]}}},"paths":{"/property":{"put":{"tags":["property"],"summary":"Create or update property data (full replacement)","description":"Replaces the property data (see PropertyUpdateRequest); creates it on first use (201). Omitted optional fields are cleared — read GET /property first and send the full object back. Rules: `street` is required unless `noStreetAddress` is true; `latitude` and `longitude` must be sent together (both or neither); `countryId` must be a valid country; `checkIn`/`checkOut` are HH:MM. Check-in/check-out hours, address and contact are shown to guests in confirmations, the booking engine and OTA listings; the logo can only be changed in the panel. Required scope: `property.update`.","operationId":"updateProperty","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyUpdateRequest"}}}},"responses":{"200":{"description":"Updated property data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyResponse"}}}},"201":{"description":"Property created","headers":{"Location":{"description":"URL of the resource","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyResponse"}}}},"400":{"description":"Bad request (malformed JSON, body is not an object, suspicious content)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem400"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem401"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem403"}}}},"422":{"description":"Validation error — e.g. missing required field, invalid time/e-mail, unknown `countryId`, `street` missing without `noStreetAddress`, only one of `latitude`/`longitude`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem422"}}}}}}}}}
```

## Get property regulations

> Returns the property regulations (terms & conditions) as a language → HTML map, or \`content: null\` when never saved. Guests see the version for their language, falling back to \`default\`. Required scope: \`regulations.read\`.

```json
{"openapi":"3.0.0","info":{"title":"Public REST API v1 – mobile-calendar.com","version":"1.0.0"},"tags":[{"name":"property","description":"Property (hotel/object) data, regulations and privacy policy."}],"servers":[{"url":"https://api.mobile-calendar.com/v1/public","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","description":"Pass the token in header: Authorization: Bearer <JWT>","bearerFormat":"JWT","scheme":"bearer"}},"schemas":{"PropertyDocumentResponse":{"description":"Document with metadata","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/PropertyDocumentEntry"},"meta":{"$ref":"#/components/schemas/MetaWithRuid"}},"type":"object"},"PropertyDocumentEntry":{"description":"Multilingual HTML document (property regulations / privacy policy) shown to guests in the booking engine and online check-in. `content` maps a language code (ISO 639-1, e.g. `pl`, `en`, `de`) or `default` (fallback for other languages) to HTML; null when the document has never been saved.","required":["content","editDate"],"properties":{"content":{"type":"object","nullable":true,"additionalProperties":{"type":"string"}},"editDate":{"description":"Last modification time (UTC); null when never saved.","type":"string","format":"date-time","nullable":true}},"type":"object"},"MetaWithRuid":{"description":"Metadata with request tracking.","required":["ruid"],"properties":{"ruid":{"description":"Request Unique ID","type":"string","format":"uuid"}},"type":"object"},"ApiProblem401":{"description":"Missing authentication or invalid credentials.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"401 Unauthorized","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblemBase":{"description":"RFC 7807 Problem Details (base schema).","required":["type","title","status","detail","instance"],"properties":{"type":{"description":"RFC 7807 base — DO NOT use directly in endpoints.\nIn endpoints reference ApiProblem400/401/403/409/422/429/500.","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"},"ApiProblem403":{"description":"Authenticated user but no access.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"403 Forbidden","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]}}},"paths":{"/property/regulations":{"get":{"tags":["property"],"summary":"Get property regulations","description":"Returns the property regulations (terms & conditions) as a language → HTML map, or `content: null` when never saved. Guests see the version for their language, falling back to `default`. Required scope: `regulations.read`.","operationId":"getPropertyRegulations","responses":{"200":{"description":"Regulations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDocumentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem401"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem403"}}}}}}}}}
```

## Replace property regulations

> Replaces the whole language map of the regulations (languages not sent are removed) — read GET first to keep other languages. \`content\` keys: \`default\` (fallback shown when the guest's language is missing) or ISO 639-1 codes (\`pl\`, \`en\`, \`de\`, …); values: HTML limited to formatting tags (headings, paragraphs, lists, tables, links, bold/italic) — scripts, iframes and event attributes are stripped, plain text is wrapped in \`\<p>\`. Empty texts are dropped; at least one non-empty text is required. Required scope: \`regulations.update\`.

```json
{"openapi":"3.0.0","info":{"title":"Public REST API v1 – mobile-calendar.com","version":"1.0.0"},"tags":[{"name":"property","description":"Property (hotel/object) data, regulations and privacy policy."}],"servers":[{"url":"https://api.mobile-calendar.com/v1/public","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","description":"Pass the token in header: Authorization: Bearer <JWT>","bearerFormat":"JWT","scheme":"bearer"}},"schemas":{"PropertyDocumentUpdateRequest":{"description":"Full replacement of the document (PUT): the whole language map is replaced, languages not sent are removed. Keys: `default` or ISO language codes. Values: HTML limited to formatting tags (headings, paragraphs, lists, tables, links, bold/italic) — other tags, scripts and event attributes are stripped. Empty texts are dropped; at least one non-empty text is required. Max 200 000 bytes per language.","required":["content"],"properties":{"content":{"minProperties":1,"type":"object","additionalProperties":{"type":"string","maxLength":200000}}},"type":"object"},"PropertyDocumentResponse":{"description":"Document with metadata","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/PropertyDocumentEntry"},"meta":{"$ref":"#/components/schemas/MetaWithRuid"}},"type":"object"},"PropertyDocumentEntry":{"description":"Multilingual HTML document (property regulations / privacy policy) shown to guests in the booking engine and online check-in. `content` maps a language code (ISO 639-1, e.g. `pl`, `en`, `de`) or `default` (fallback for other languages) to HTML; null when the document has never been saved.","required":["content","editDate"],"properties":{"content":{"type":"object","nullable":true,"additionalProperties":{"type":"string"}},"editDate":{"description":"Last modification time (UTC); null when never saved.","type":"string","format":"date-time","nullable":true}},"type":"object"},"MetaWithRuid":{"description":"Metadata with request tracking.","required":["ruid"],"properties":{"ruid":{"description":"Request Unique ID","type":"string","format":"uuid"}},"type":"object"},"ApiProblem400":{"description":"Request syntax/format error.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"400 Bad Request","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblemBase":{"description":"RFC 7807 Problem Details (base schema).","required":["type","title","status","detail","instance"],"properties":{"type":{"description":"RFC 7807 base — DO NOT use directly in endpoints.\nIn endpoints reference ApiProblem400/401/403/409/422/429/500.","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"},"ApiProblem401":{"description":"Missing authentication or invalid credentials.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"401 Unauthorized","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblem403":{"description":"Authenticated user but no access.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"403 Forbidden","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblem422":{"description":"Input data validation error.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"422 Unprocessable Entity (validation)","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"errors":{"description":"Map: field name → error message(s)","type":"object","additionalProperties":{"$ref":"#/components/schemas/ErrorValue"}}},"type":"object"}]},"ErrorValue":{"description":"Single error message or list of messages.","oneOf":[{"description":"Error value in error map can be:\n- single string, or\n- array of strings (multiple messages for one field).","type":"string"},{"type":"array","items":{"type":"string"}}]}}},"paths":{"/property/regulations":{"put":{"tags":["property"],"summary":"Replace property regulations","description":"Replaces the whole language map of the regulations (languages not sent are removed) — read GET first to keep other languages. `content` keys: `default` (fallback shown when the guest's language is missing) or ISO 639-1 codes (`pl`, `en`, `de`, …); values: HTML limited to formatting tags (headings, paragraphs, lists, tables, links, bold/italic) — scripts, iframes and event attributes are stripped, plain text is wrapped in `<p>`. Empty texts are dropped; at least one non-empty text is required. Required scope: `regulations.update`.","operationId":"updatePropertyRegulations","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDocumentUpdateRequest"}}}},"responses":{"200":{"description":"Saved regulations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDocumentResponse"}}}},"400":{"description":"Bad request (malformed JSON, body is not an object, suspicious content)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem400"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem401"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem403"}}}},"422":{"description":"Validation error — e.g. `content` missing/not an object, unsupported language key, all texts empty, text too long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem422"}}}}}}}}}
```

## Get property privacy policy

> Returns the property privacy policy as a language → HTML map, or \`content: null\` when never saved. Required scope: \`regulations.read\`.

```json
{"openapi":"3.0.0","info":{"title":"Public REST API v1 – mobile-calendar.com","version":"1.0.0"},"tags":[{"name":"property","description":"Property (hotel/object) data, regulations and privacy policy."}],"servers":[{"url":"https://api.mobile-calendar.com/v1/public","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","description":"Pass the token in header: Authorization: Bearer <JWT>","bearerFormat":"JWT","scheme":"bearer"}},"schemas":{"PropertyDocumentResponse":{"description":"Document with metadata","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/PropertyDocumentEntry"},"meta":{"$ref":"#/components/schemas/MetaWithRuid"}},"type":"object"},"PropertyDocumentEntry":{"description":"Multilingual HTML document (property regulations / privacy policy) shown to guests in the booking engine and online check-in. `content` maps a language code (ISO 639-1, e.g. `pl`, `en`, `de`) or `default` (fallback for other languages) to HTML; null when the document has never been saved.","required":["content","editDate"],"properties":{"content":{"type":"object","nullable":true,"additionalProperties":{"type":"string"}},"editDate":{"description":"Last modification time (UTC); null when never saved.","type":"string","format":"date-time","nullable":true}},"type":"object"},"MetaWithRuid":{"description":"Metadata with request tracking.","required":["ruid"],"properties":{"ruid":{"description":"Request Unique ID","type":"string","format":"uuid"}},"type":"object"},"ApiProblem401":{"description":"Missing authentication or invalid credentials.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"401 Unauthorized","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblemBase":{"description":"RFC 7807 Problem Details (base schema).","required":["type","title","status","detail","instance"],"properties":{"type":{"description":"RFC 7807 base — DO NOT use directly in endpoints.\nIn endpoints reference ApiProblem400/401/403/409/422/429/500.","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"},"ApiProblem403":{"description":"Authenticated user but no access.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"403 Forbidden","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]}}},"paths":{"/property/privacy-policy":{"get":{"tags":["property"],"summary":"Get property privacy policy","description":"Returns the property privacy policy as a language → HTML map, or `content: null` when never saved. Required scope: `regulations.read`.","operationId":"getPropertyPrivacyPolicy","responses":{"200":{"description":"Privacy policy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDocumentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem401"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem403"}}}}}}}}}
```

## Replace property privacy policy

> Replaces the whole language map of the privacy policy (languages not sent are removed) — read GET first to keep other languages. Same rules as PUT /property/regulations: keys \`default\` or ISO 639-1 codes, values = HTML limited to formatting tags (scripts/event attributes stripped), at least one non-empty text. Required scope: \`regulations.update\`.

```json
{"openapi":"3.0.0","info":{"title":"Public REST API v1 – mobile-calendar.com","version":"1.0.0"},"tags":[{"name":"property","description":"Property (hotel/object) data, regulations and privacy policy."}],"servers":[{"url":"https://api.mobile-calendar.com/v1/public","description":"Production"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","description":"Pass the token in header: Authorization: Bearer <JWT>","bearerFormat":"JWT","scheme":"bearer"}},"schemas":{"PropertyDocumentUpdateRequest":{"description":"Full replacement of the document (PUT): the whole language map is replaced, languages not sent are removed. Keys: `default` or ISO language codes. Values: HTML limited to formatting tags (headings, paragraphs, lists, tables, links, bold/italic) — other tags, scripts and event attributes are stripped. Empty texts are dropped; at least one non-empty text is required. Max 200 000 bytes per language.","required":["content"],"properties":{"content":{"minProperties":1,"type":"object","additionalProperties":{"type":"string","maxLength":200000}}},"type":"object"},"PropertyDocumentResponse":{"description":"Document with metadata","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/PropertyDocumentEntry"},"meta":{"$ref":"#/components/schemas/MetaWithRuid"}},"type":"object"},"PropertyDocumentEntry":{"description":"Multilingual HTML document (property regulations / privacy policy) shown to guests in the booking engine and online check-in. `content` maps a language code (ISO 639-1, e.g. `pl`, `en`, `de`) or `default` (fallback for other languages) to HTML; null when the document has never been saved.","required":["content","editDate"],"properties":{"content":{"type":"object","nullable":true,"additionalProperties":{"type":"string"}},"editDate":{"description":"Last modification time (UTC); null when never saved.","type":"string","format":"date-time","nullable":true}},"type":"object"},"MetaWithRuid":{"description":"Metadata with request tracking.","required":["ruid"],"properties":{"ruid":{"description":"Request Unique ID","type":"string","format":"uuid"}},"type":"object"},"ApiProblem400":{"description":"Request syntax/format error.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"400 Bad Request","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblemBase":{"description":"RFC 7807 Problem Details (base schema).","required":["type","title","status","detail","instance"],"properties":{"type":{"description":"RFC 7807 base — DO NOT use directly in endpoints.\nIn endpoints reference ApiProblem400/401/403/409/422/429/500.","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"},"ApiProblem401":{"description":"Missing authentication or invalid credentials.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"401 Unauthorized","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblem403":{"description":"Authenticated user but no access.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"403 Forbidden","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}},"type":"object"}]},"ApiProblem422":{"description":"Input data validation error.","allOf":[{"$ref":"#/components/schemas/ApiProblemBase"},{"properties":{"type":{"description":"422 Unprocessable Entity (validation)","type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"errors":{"description":"Map: field name → error message(s)","type":"object","additionalProperties":{"$ref":"#/components/schemas/ErrorValue"}}},"type":"object"}]},"ErrorValue":{"description":"Single error message or list of messages.","oneOf":[{"description":"Error value in error map can be:\n- single string, or\n- array of strings (multiple messages for one field).","type":"string"},{"type":"array","items":{"type":"string"}}]}}},"paths":{"/property/privacy-policy":{"put":{"tags":["property"],"summary":"Replace property privacy policy","description":"Replaces the whole language map of the privacy policy (languages not sent are removed) — read GET first to keep other languages. Same rules as PUT /property/regulations: keys `default` or ISO 639-1 codes, values = HTML limited to formatting tags (scripts/event attributes stripped), at least one non-empty text. Required scope: `regulations.update`.","operationId":"updatePropertyPrivacyPolicy","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDocumentUpdateRequest"}}}},"responses":{"200":{"description":"Saved privacy policy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDocumentResponse"}}}},"400":{"description":"Bad request (malformed JSON, body is not an object, suspicious content)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem400"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem401"}}}},"403":{"description":"Insufficient scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem403"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiProblem422"}}}}}}}}}
```
